Skip to content

Commit ac82864

Browse files
committed
Relate dependencies to packages #447
* Show and link relations in the views Signed-off-by: Jono Yang <[email protected]>
1 parent 2640c2f commit ac82864

File tree

5 files changed

+50
-6
lines changed

5 files changed

+50
-6
lines changed

scanpipe/migrations/0019_remove_discoveredpackage_dependencies_and_more.py renamed to scanpipe/migrations/0019_codebaseresource_package_data_and_more.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.0.6 on 2022-07-30 00:41
1+
# Generated by Django 4.0.6 on 2022-08-03 18:36
22

33
from django.db import migrations, models
44
import django.db.models.deletion
@@ -12,10 +12,6 @@ class Migration(migrations.Migration):
1212
]
1313

1414
operations = [
15-
migrations.RemoveField(
16-
model_name='discoveredpackage',
17-
name='dependencies',
18-
),
1915
migrations.AddField(
2016
model_name='codebaseresource',
2117
name='package_data',
@@ -26,6 +22,10 @@ class Migration(migrations.Migration):
2622
name='name',
2723
field=models.CharField(blank=True, help_text='File or directory name of this resource with its extension.', max_length=255),
2824
),
25+
migrations.RemoveField(
26+
model_name='discoveredpackage',
27+
name='dependencies',
28+
),
2929
migrations.CreateModel(
3030
name='DiscoveredDependency',
3131
fields=[
@@ -47,4 +47,9 @@ class Migration(migrations.Migration):
4747
},
4848
bases=(models.Model, scanpipe.models.SaveProjectErrorMixin),
4949
),
50+
migrations.AddField(
51+
model_name='discoveredpackage',
52+
name='dependencies',
53+
field=models.ManyToManyField(related_name='discovered_packages', to='scanpipe.discovereddependency'),
54+
),
5055
]

scanpipe/models.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,6 +1799,9 @@ class DiscoveredPackage(
17991799
codebase_resources = models.ManyToManyField(
18001800
"CodebaseResource", related_name="discovered_packages"
18011801
)
1802+
dependencies = models.ManyToManyField(
1803+
"DiscoveredDependency", related_name="discovered_packages"
1804+
)
18021805
missing_resources = models.JSONField(default=list, blank=True)
18031806
modified_resources = models.JSONField(default=list, blank=True)
18041807
package_uid = models.CharField(
@@ -1928,6 +1931,10 @@ def update_from_data(self, package_data, override=False):
19281931
return updated_fields
19291932

19301933

1934+
class DiscoveredDependencyQuerySet(ProjectRelatedQuerySet):
1935+
pass
1936+
1937+
19311938
class DiscoveredDependency(
19321939
ProjectRelatedModel,
19331940
SaveProjectErrorMixin,
@@ -1980,12 +1987,21 @@ class DiscoveredDependency(
19801987
),
19811988
)
19821989

1990+
objects = DiscoveredDependencyQuerySet.as_manager()
1991+
19831992
def __str__(self):
19841993
return self.purl or str(self.uuid)
19851994

19861995
def get_absolute_url(self):
19871996
return reverse("dependency_detail", args=[self.project_id, self.pk])
19881997

1998+
@cached_property
1999+
def packages(self):
2000+
"""
2001+
Returns the associated discovered_packages QuerySet as a list.
2002+
"""
2003+
return list(self.discovered_packages.all())
2004+
19892005
@classmethod
19902006
def create_from_data(cls, project, dependency_data):
19912007
"""

scanpipe/pipes/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,12 @@ def update_or_create_dependencies(project, dependency_data):
111111
Uses the `project` and `dependency_data` mapping to lookup and creates the
112112
DiscoveredDependency using its dependency_uid and for_package_uid as a unique key.
113113
"""
114+
for_package_uid = dependency_data.get("for_package_uid")
114115
try:
115116
dependency = DiscoveredDependency.objects.get(
116117
project=project,
117118
dependency_uid=dependency_data.get("dependency_uid"),
118-
for_package_uid=dependency_data.get("for_package_uid"),
119+
for_package_uid=for_package_uid,
119120
)
120121
except DiscoveredDependency.DoesNotExist:
121122
dependency = None
@@ -125,6 +126,14 @@ def update_or_create_dependencies(project, dependency_data):
125126
else:
126127
dependency = DiscoveredDependency.create_from_data(project, dependency_data)
127128

129+
if for_package_uid:
130+
package_exists_in_project = project.discoveredpackages.filter(
131+
package_uid=for_package_uid
132+
).exists()
133+
if package_exists_in_project:
134+
package = project.discoveredpackages.get(package_uid=for_package_uid)
135+
dependency.discovered_packages.add(package)
136+
128137
return dependency
129138

130139

scanpipe/templates/scanpipe/dependency_list.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<th>For package UID</th>
2929
<th>Datafile path</th>
3030
<th>Datasource ID</th>
31+
<th>From Packages</th>
3132
</tr>
3233
</thead>
3334
<tbody>
@@ -63,6 +64,18 @@
6364
<td>
6465
{{ dependency.datasource_id }}
6566
</td>
67+
<td class="is-clipped-list">
68+
<ul>
69+
{% for package in dependency.packages %}
70+
<li>
71+
<a href="{{ package.get_absolute_url }}" title="{{ package.purl }}">{{ package.purl }}</a>
72+
</li>
73+
{% endfor %}
74+
</ul>
75+
{% if dependency.packages|length > 5 %}
76+
<button class="button is-small is-fullwidth show-clipped">Show {{ dependency.packages|length }} packages</button>
77+
{% endif %}
78+
</td>
6679
</tr>
6780
{% endfor %}
6881
</tbody>

scanpipe/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ class DiscoveredDependencyListView(
620620
filterset_class = DependencyFilterSet
621621
template_name = "scanpipe/dependency_list.html"
622622
paginate_by = 100
623+
prefetch_related = ["discovered_packages"]
623624

624625

625626
class ProjectErrorListView(

0 commit comments

Comments
 (0)