From 584cc238f199828611b283bdc060597fda60741a Mon Sep 17 00:00:00 2001 From: tdruez Date: Mon, 29 Jul 2024 13:18:49 +0400 Subject: [PATCH] Add a dependency tree view based on d3.js #1145 Signed-off-by: tdruez --- .../templates/scanpipe/dependency_list.html | 6 +++ .../scanpipe/project_dependency_tree.html | 44 +++++++++++++++++++ scanpipe/urls.py | 5 +++ scanpipe/views.py | 31 +++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 scanpipe/templates/scanpipe/project_dependency_tree.html diff --git a/scanpipe/templates/scanpipe/dependency_list.html b/scanpipe/templates/scanpipe/dependency_list.html index 51ba0821f..92a3de0b6 100644 --- a/scanpipe/templates/scanpipe/dependency_list.html +++ b/scanpipe/templates/scanpipe/dependency_list.html @@ -16,6 +16,12 @@
+ + + + + View the dependency tree + {% include 'scanpipe/includes/list_view_thead.html' %} diff --git a/scanpipe/templates/scanpipe/project_dependency_tree.html b/scanpipe/templates/scanpipe/project_dependency_tree.html new file mode 100644 index 000000000..17251af27 --- /dev/null +++ b/scanpipe/templates/scanpipe/project_dependency_tree.html @@ -0,0 +1,44 @@ +{% extends "scanpipe/base.html" %} + +{% block title %}ScanCode.io: {{ project.name }} - Dependency tree{% endblock %} + +{% block content %} +
+ {% include 'scanpipe/includes/navbar_header.html' %} +
+
+ {% include 'scanpipe/includes/breadcrumb.html' with linked_project=True current="Dependency tree" %} +
+
+
+ +
+
+
+{% endblock %} + +{% block scripts %} + + + {{ dependency_tree|json_script:"dependency_tree" }} + +{% endblock %} \ No newline at end of file diff --git a/scanpipe/urls.py b/scanpipe/urls.py index ce3e37fbc..8bebb60f5 100644 --- a/scanpipe/urls.py +++ b/scanpipe/urls.py @@ -71,6 +71,11 @@ views.DiscoveredDependencyListView.as_view(), name="project_dependencies", ), + path( + "project//dependency_tree/", + views.ProjectDependencyTreeView.as_view(), + name="project_dependency_tree", + ), path( "project//relations/", views.CodebaseRelationListView.as_view(), diff --git a/scanpipe/views.py b/scanpipe/views.py index e092079d3..2a7e932e7 100644 --- a/scanpipe/views.py +++ b/scanpipe/views.py @@ -2281,3 +2281,34 @@ def get_object(self, queryset=None): return licenses[key] except KeyError: raise Http404(f"License {key} not found.") + + +class ProjectDependencyTreeView(ConditionalLoginRequired, generic.DetailView): + model = Project + template_name = "scanpipe/project_dependency_tree.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["dependency_tree"] = self.get_dependency_tree(project=self.object) + return context + + def get_dependency_tree(self, project): + root_packages = project.discoveredpackages.root_packages() + project_children = [self.get_node(package) for package in root_packages] + + project_tree = { + "name": project.name, + "children": project_children, + } + + return project_tree + + def get_node(self, package): + node = {"name": str(package)} + children = [ + self.get_node(child_package) + for child_package in package.children_packages.all() + ] + if children: + node["children"] = children + return node