Skip to content

Commit d8d0908

Browse files
committed
Add project name in all serializers #1524
Signed-off-by: tdruez <[email protected]>
1 parent b683d10 commit d8d0908

File tree

6 files changed

+43
-10
lines changed

6 files changed

+43
-10
lines changed

scanpipe/api/serializers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ def create(self, validated_data):
336336
class CodebaseResourceSerializer(serializers.ModelSerializer):
337337
for_packages = serializers.JSONField()
338338
compliance_alert = serializers.CharField()
339+
project = serializers.CharField(source="project.name")
339340

340341
class Meta:
341342
model = CodebaseResource
@@ -379,12 +380,14 @@ class Meta:
379380
"emails",
380381
"urls",
381382
"extra_data",
383+
"project",
382384
]
383385

384386

385387
class DiscoveredPackageSerializer(serializers.ModelSerializer):
386388
purl = serializers.CharField(source="package_url")
387389
compliance_alert = serializers.CharField()
390+
project = serializers.CharField(source="project.name")
388391

389392
class Meta:
390393
model = DiscoveredPackage
@@ -438,6 +441,7 @@ class Meta:
438441
"missing_resources",
439442
"modified_resources",
440443
"affected_by_vulnerabilities",
444+
"project",
441445
]
442446

443447

@@ -447,6 +451,7 @@ class DiscoveredDependencySerializer(serializers.ModelSerializer):
447451
resolved_to_package_uid = serializers.ReadOnlyField()
448452
datafile_path = serializers.ReadOnlyField()
449453
package_type = serializers.ReadOnlyField(source="type")
454+
project = serializers.CharField(source="project.name")
450455

451456
class Meta:
452457
model = DiscoveredDependency
@@ -465,12 +470,14 @@ class Meta:
465470
"datasource_id",
466471
"package_type",
467472
"affected_by_vulnerabilities",
473+
"project",
468474
]
469475

470476

471477
class CodebaseRelationSerializer(serializers.ModelSerializer):
472478
from_resource = serializers.ReadOnlyField(source="from_resource.path")
473479
to_resource = serializers.ReadOnlyField(source="to_resource.path")
480+
project = serializers.CharField(source="project.name")
474481

475482
class Meta:
476483
model = CodebaseRelation
@@ -480,11 +487,13 @@ class Meta:
480487
"map_type",
481488
"score",
482489
"from_resource",
490+
"project",
483491
]
484492

485493

486494
class ProjectMessageSerializer(serializers.ModelSerializer):
487495
traceback = serializers.SerializerMethodField()
496+
project = serializers.CharField(source="project.name")
488497

489498
class Meta:
490499
model = ProjectMessage
@@ -496,6 +505,7 @@ class Meta:
496505
"details",
497506
"traceback",
498507
"created_date",
508+
"project",
499509
]
500510

501511
def get_traceback(self, project_error):

scanpipe/api/views.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,15 +232,17 @@ def packages(self, request, *args, **kwargs):
232232
@action(detail=True, filterset_class=None)
233233
def dependencies(self, request, *args, **kwargs):
234234
project = self.get_object()
235-
queryset = project.discovereddependencies.all()
235+
queryset = project.discovereddependencies.prefetch_for_serializer()
236236
return self.get_filtered_response(
237237
request, queryset, DependencyFilterSet, DiscoveredDependencySerializer
238238
)
239239

240240
@action(detail=True, filterset_class=None)
241241
def relations(self, request, *args, **kwargs):
242242
project = self.get_object()
243-
queryset = project.codebaserelations.all()
243+
queryset = project.codebaserelations.select_related(
244+
"from_resource", "to_resource"
245+
)
244246
return self.get_filtered_response(
245247
request, queryset, RelationFilterSet, CodebaseRelationSerializer
246248
)

scanpipe/filters.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,10 @@ def __init__(self, data=None, *args, **kwargs):
423423
if not data or data.get("is_archived", "") == "":
424424
self.queryset = self.queryset.filter(is_archived=False)
425425

426-
active_count = Project.objects.filter(is_archived=False).count()
427-
archived_count = Project.objects.filter(is_archived=True).count()
426+
counts = Project.objects.get_active_archived_counts()
427+
active_count = counts["active_count"]
428+
archived_count = counts["archived_count"]
429+
428430
self.filters["is_archived"].extra["widget"] = BulmaLinkWidget(
429431
choices=[
430432
("", f'<i class="fa-solid fa-seedling"></i> {active_count} Active'),

scanpipe/models.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@
4444
from django.core.validators import EMPTY_VALUES
4545
from django.db import models
4646
from django.db import transaction
47+
from django.db.models import Case
4748
from django.db.models import Count
4849
from django.db.models import IntegerField
4950
from django.db.models import OuterRef
5051
from django.db.models import Prefetch
5152
from django.db.models import Q
5253
from django.db.models import Subquery
5354
from django.db.models import TextField
55+
from django.db.models import When
5456
from django.db.models.functions import Cast
5557
from django.db.models.functions import Lower
5658
from django.dispatch import receiver
@@ -518,6 +520,16 @@ def with_counts(self, *fields):
518520

519521
return self.annotate(**annotations)
520522

523+
def get_active_archived_counts(self):
524+
return self.aggregate(
525+
active_count=Count(
526+
Case(When(is_archived=False, then=1), output_field=IntegerField())
527+
),
528+
archived_count=Count(
529+
Case(When(is_archived=True, then=1), output_field=IntegerField())
530+
),
531+
)
532+
521533

522534
class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
523535
class Meta:

scanpipe/tests/test_api.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ def test_scanpipe_api_project_action_relations(self):
779779
"to_resource": "daglib-0.3.2.tar.gz-extract/daglib-0.3.2/PKG-INFO",
780780
"status": "",
781781
"map_type": "java_to_class",
782+
"project": "Analysis",
782783
"score": "",
783784
"from_resource": "daglib-0.3.2.tar.gz-extract/daglib-0.3.2/PKG-INFO",
784785
}
@@ -1183,11 +1184,11 @@ def test_scanpipe_api_serializer_get_model_serializer(self):
11831184
get_model_serializer(None)
11841185

11851186
def test_scanpipe_api_serializer_get_serializer_fields(self):
1186-
self.assertEqual(49, len(get_serializer_fields(DiscoveredPackage)))
1187-
self.assertEqual(14, len(get_serializer_fields(DiscoveredDependency)))
1188-
self.assertEqual(37, len(get_serializer_fields(CodebaseResource)))
1189-
self.assertEqual(5, len(get_serializer_fields(CodebaseRelation)))
1190-
self.assertEqual(7, len(get_serializer_fields(ProjectMessage)))
1187+
self.assertEqual(50, len(get_serializer_fields(DiscoveredPackage)))
1188+
self.assertEqual(15, len(get_serializer_fields(DiscoveredDependency)))
1189+
self.assertEqual(38, len(get_serializer_fields(CodebaseResource)))
1190+
self.assertEqual(6, len(get_serializer_fields(CodebaseRelation)))
1191+
self.assertEqual(8, len(get_serializer_fields(ProjectMessage)))
11911192

11921193
with self.assertRaises(LookupError):
11931194
get_serializer_fields(None)

scanpipe/views.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,13 @@ class ProjectListView(
551551
Prefetch(
552552
"runs",
553553
queryset=Run.objects.only(
554-
"uuid", "pipeline_name", "project_id", "task_exitcode"
554+
"uuid",
555+
"pipeline_name",
556+
"project_id",
557+
"task_id",
558+
"task_start_date",
559+
"task_end_date",
560+
"task_exitcode",
555561
),
556562
),
557563
]

0 commit comments

Comments
 (0)