Skip to content

Commit f5d504c

Browse files
committed
Keep the InputSource objects when using reset on Projects #1536
Signed-off-by: tdruez <tdruez@nexb.com>
1 parent ce227cd commit f5d504c

File tree

6 files changed

+74
-56
lines changed

6 files changed

+74
-56
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ v34.9.4 (unreleased)
4747
sheets with a dedicated VULNERABILITIES sheet.
4848
https://github.com/aboutcode-org/scancode.io/issues/1519
4949

50+
- Keep the InputSource objects when using ``reset`` on Projects.
51+
https://github.com/aboutcode-org/scancode.io/issues/1536
52+
5053
- Add a ``report`` management command that allows to generate XLSX reports for
5154
multiple projects at once using labels and searching by project name.
5255
https://github.com/aboutcode-org/scancode.io/issues/1524

scanpipe/models.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -640,14 +640,14 @@ def archive(self, remove_input=False, remove_codebase=False, remove_output=False
640640
self.is_archived = True
641641
self.save(update_fields=["is_archived"])
642642

643-
def delete_related_objects(self):
643+
def delete_related_objects(self, keep_input=False):
644644
"""
645645
Delete all related object instances using the private `_raw_delete` model API.
646646
This bypass the objects collection, cascade deletions, and signals.
647647
It results in a much faster objects deletion, but it needs to be applied in the
648648
correct models order as the cascading event will not be triggered.
649649
Note that this approach is used in Django's `fast_deletes` but the scanpipe
650-
models are cannot be fast-deleted as they have cascades and relations.
650+
models cannot be fast-deleted as they have cascades and relations.
651651
"""
652652
# Use default `delete()` on the DiscoveredPackage model, as the
653653
# `codebase_resources (ManyToManyField)` records need to collected and
@@ -667,9 +667,11 @@ def delete_related_objects(self):
667667
self.discovereddependencies,
668668
self.codebaseresources,
669669
self.runs,
670-
self.inputsources,
671670
]
672671

672+
if not keep_input:
673+
relationships.append(self.inputsources)
674+
673675
for qs in relationships:
674676
count = qs.all()._raw_delete(qs.db)
675677
deleted_counter[qs.model._meta.label] = count
@@ -695,7 +697,7 @@ def reset(self, keep_input=True):
695697
"""
696698
self._raise_if_run_in_progress()
697699

698-
self.delete_related_objects()
700+
self.delete_related_objects(keep_input=keep_input)
699701

700702
work_directories = [
701703
self.codebase_path,

scanpipe/tests/__init__.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from scanpipe.models import DiscoveredDependency
3232
from scanpipe.models import DiscoveredPackage
3333
from scanpipe.models import Project
34+
from scanpipe.models import ProjectMessage
3435
from scanpipe.tests.pipelines.do_nothing import DoNothing
3536
from scanpipe.tests.pipelines.download_inputs import DownloadInput
3637
from scanpipe.tests.pipelines.profile_step import ProfileStep
@@ -47,12 +48,12 @@
4748
mocked_now = mock.Mock(now=lambda: datetime(2010, 10, 10, 10, 10, 10))
4849

4950

50-
def make_project(name=None, **extra):
51+
def make_project(name=None, **data):
5152
name = name or str(uuid.uuid4())[:8]
52-
return Project.objects.create(name=name, **extra)
53+
return Project.objects.create(name=name, **data)
5354

5455

55-
def make_resource_file(project, path, **extra):
56+
def make_resource_file(project, path, **data):
5657
return CodebaseResource.objects.create(
5758
project=project,
5859
path=path,
@@ -61,30 +62,43 @@ def make_resource_file(project, path, **extra):
6162
type=CodebaseResource.Type.FILE,
6263
is_text=True,
6364
tag=path.split("/")[0],
64-
**extra,
65+
**data,
6566
)
6667

6768

68-
def make_resource_directory(project, path, **extra):
69+
def make_resource_directory(project, path, **data):
6970
return CodebaseResource.objects.create(
7071
project=project,
7172
path=path,
7273
name=path.split("/")[-1],
7374
type=CodebaseResource.Type.DIRECTORY,
7475
tag=path.split("/")[0],
75-
**extra,
76+
**data,
7677
)
7778

7879

79-
def make_package(project, package_url, **extra):
80-
package = DiscoveredPackage(project=project, **extra)
80+
def make_package(project, package_url, **data):
81+
package = DiscoveredPackage(project=project, **data)
8182
package.set_package_url(package_url)
8283
package.save()
8384
return package
8485

8586

86-
def make_dependency(project, **extra):
87-
return DiscoveredDependency.objects.create(project=project, **extra)
87+
def make_dependency(project, **data):
88+
return DiscoveredDependency.objects.create(project=project, **data)
89+
90+
91+
def make_message(project, **data):
92+
if "model" not in data:
93+
data["model"] = str(uuid.uuid4())[:8]
94+
95+
if "severity" not in data:
96+
data["severity"] = ProjectMessage.Severity.ERROR
97+
98+
return ProjectMessage.objects.create(
99+
project=project,
100+
**data,
101+
)
88102

89103

90104
resource_data1 = {

scanpipe/tests/pipes/test_output.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@
4242
from scanpipe import pipes
4343
from scanpipe.models import CodebaseResource
4444
from scanpipe.models import Project
45-
from scanpipe.models import ProjectMessage
4645
from scanpipe.pipes import flag
4746
from scanpipe.pipes import output
4847
from scanpipe.tests import FIXTURES_REGEN
4948
from scanpipe.tests import make_dependency
49+
from scanpipe.tests import make_message
5050
from scanpipe.tests import make_package
5151
from scanpipe.tests import make_resource_file
5252
from scanpipe.tests import mocked_now
@@ -206,13 +206,7 @@ def test_scanpipe_pipes_outputs_to_xlsx(self):
206206
call_command("loaddata", fixtures, **{"verbosity": 0})
207207

208208
project = Project.objects.get(name="asgiref")
209-
ProjectMessage.objects.create(
210-
project=project,
211-
severity=ProjectMessage.Severity.ERROR,
212-
description="Error",
213-
model="Model",
214-
details={},
215-
)
209+
make_message(project, description="Error")
216210
make_resource_file(
217211
project=project, path="path/file1.ext", status=flag.REQUIRES_REVIEW
218212
)

scanpipe/tests/test_api.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
from scanpipe.pipes.input import copy_input
5555
from scanpipe.pipes.output import JSONResultsGenerator
5656
from scanpipe.tests import dependency_data1
57+
from scanpipe.tests import make_message
5758
from scanpipe.tests import make_package
5859
from scanpipe.tests import make_project
5960
from scanpipe.tests import make_resource_file
@@ -795,13 +796,7 @@ def test_scanpipe_api_project_action_relations_filterset(self):
795796

796797
def test_scanpipe_api_project_action_messages(self):
797798
url = reverse("project-messages", args=[self.project1.uuid])
798-
ProjectMessage.objects.create(
799-
project=self.project1,
800-
severity=ProjectMessage.Severity.ERROR,
801-
description="Error",
802-
model="ModelName",
803-
details={},
804-
)
799+
make_message(self.project1, description="Error")
805800

806801
response = self.csrf_client.get(url)
807802
self.assertEqual(1, response.data["count"])
@@ -812,7 +807,6 @@ def test_scanpipe_api_project_action_messages(self):
812807
message = response.data["results"][0]
813808
self.assertEqual("error", message["severity"])
814809
self.assertEqual("Error", message["description"])
815-
self.assertEqual("ModelName", message["model"])
816810
self.assertEqual({}, message["details"])
817811

818812
def test_scanpipe_api_project_action_file_content(self):

0 commit comments

Comments
 (0)