Skip to content

Commit

Permalink
Run the improve_packages_from_purldb as async task #45
Browse files Browse the repository at this point in the history
Signed-off-by: tdruez <tdruez@nexb.com>
  • Loading branch information
tdruez committed Jul 10, 2024
1 parent 3151970 commit 3841671
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 8 deletions.
54 changes: 50 additions & 4 deletions dje/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from django.template.defaultfilters import pluralize

from django_rq import job
from notifications.signals import notify

from dejacode_toolkit.scancodeio import ScanCodeIO
from dje.utils import is_available
Expand Down Expand Up @@ -92,16 +93,17 @@ def scancodeio_submit_scan(uris, user_uuid, dataspace_uuid):
Submit the provided `uris` to ScanCode.io as an asynchronous task.
Only publicly available URLs are sent to ScanCode.io.
"""
from dje.models import DejacodeUser

logger.info(
f"Entering scancodeio_submit_scan task with "
f"uris={uris} user_uuid={user_uuid} dataspace_uuid={dataspace_uuid}"
)

DejacodeUser = apps.get_model("dje", "DejacodeUser")

try:
user = DejacodeUser.objects.get(uuid=user_uuid, dataspace__uuid=dataspace_uuid)
except ObjectDoesNotExist:
logger.error(f"[scancodeio_submit_scan]: User uuid={user_uuid} does not exists.")
return

if not isinstance(uris, list):
Expand All @@ -118,20 +120,20 @@ def scancodeio_submit_scan(uris, user_uuid, dataspace_uuid):
@job
def scancodeio_submit_project(scancodeproject_uuid, user_uuid, pipeline_name):
"""Submit the provided SBOM file to ScanCode.io as an asynchronous task."""
from dje.models import DejacodeUser

logger.info(
f"Entering scancodeio_submit_project task with "
f"scancodeproject_uuid={scancodeproject_uuid} user_uuid={user_uuid} "
f"pipeline_name={pipeline_name}"
)

DejacodeUser = apps.get_model("dje", "DejacodeUser")
ScanCodeProject = apps.get_model("product_portfolio", "scancodeproject")
scancode_project = ScanCodeProject.objects.get(uuid=scancodeproject_uuid)

try:
user = DejacodeUser.objects.get(uuid=user_uuid)
except ObjectDoesNotExist:
logger.error(f"[scancodeio_submit_project]: User uuid={user_uuid} does not exists.")
return

scancodeio = ScanCodeIO(user.dataspace)
Expand Down Expand Up @@ -219,3 +221,47 @@ def pull_project_data_from_scancodeio(scancodeproject_uuid):
scancode_project.save()
description = "\n".join(scancode_project.import_log)
scancode_project.notify(verb=notification_verb, description=description)


@job("default", timeout=1200)
def improve_packages_from_purldb(product_uuid, user_uuid):
logger.info(
f"Entering improve_packages_from_purldb task with "
f"product_uuid={product_uuid} user_uuid={user_uuid}"
)

DejacodeUser = apps.get_model("dje", "DejacodeUser")
History = apps.get_model("dje", "History")
Product = apps.get_model("product_portfolio", "product")

try:
user = DejacodeUser.objects.get(uuid=user_uuid)
except ObjectDoesNotExist:
logger.error(f"[improve_packages_from_purldb]: User uuid={user_uuid} does not exists.")
return

try:
product = Product.objects.get_queryset(user).get(uuid=product_uuid)
except ObjectDoesNotExist:
logger.error(
f"[improve_packages_from_purldb]: Product uuid={product_uuid} does not exists."
)
return

updated_packages = product.improve_packages_from_purldb(user)
logger.info(f"[improve_packages_from_purldb]: {len(updated_packages)} updated from PurlDB.")

verb = "Improved packages from PurlDB"
if updated_packages:
description = ", ".join([str(package) for package in updated_packages])
History.log_change(user, product, message=f"{verb}: {description}")
else:
description = "No packages updated from PurlDB data."

notify.send(
sender=user,
verb=verb,
action_object=product,
recipient=user,
description=description,
)
12 changes: 8 additions & 4 deletions product_portfolio/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2103,10 +2103,10 @@ def scancodeio_project_status_view(request, scancodeproject_uuid):
def improve_packages_from_purldb_view(request, dataspace, name, version=""):
user = request.user

purldb = PurlDB(user)
purldb = PurlDB(user.dataspace)
conditions = [
purldb.is_configured(),
# user.is_superuser,
user.is_superuser,
user.dataspace.enable_purldb_access,
user.dataspace.name == dataspace,
]
Expand All @@ -2120,7 +2120,11 @@ def improve_packages_from_purldb_view(request, dataspace, name, version=""):
if not product.packages.count():
raise Http404("No packages available for this product.")

transaction.on_commit(lambda: product.improve_packages_from_purldb(user))
transaction.on_commit(
lambda: tasks.improve_packages_from_purldb(
product_uuid=product.uuid,
user_uuid=user.uuid,
)
)
messages.success(request, "Improve Packages from PurlDB in progress...")

return redirect(product)

0 comments on commit 3841671

Please sign in to comment.