From fabb3086e53f718797e01bd2316b1255afb56484 Mon Sep 17 00:00:00 2001 From: Keshav Priyadarshi Date: Wed, 23 Oct 2024 13:53:18 +0530 Subject: [PATCH] Add project_purl field to project Signed-off-by: Keshav Priyadarshi --- scanpipe/api/serializers.py | 1 + scanpipe/forms.py | 15 +++++++++++++++ .../migrations/0068_project_project_purl.py | 18 ++++++++++++++++++ scanpipe/models.py | 6 ++++++ .../templates/scanpipe/project_settings.html | 8 ++++++++ 5 files changed, 48 insertions(+) create mode 100644 scanpipe/migrations/0068_project_project_purl.py diff --git a/scanpipe/api/serializers.py b/scanpipe/api/serializers.py index 5da4f1186..32c3a3001 100644 --- a/scanpipe/api/serializers.py +++ b/scanpipe/api/serializers.py @@ -203,6 +203,7 @@ class Meta: "name", "url", "uuid", + "project_purl", "upload_file", "upload_file_tag", "input_urls", diff --git a/scanpipe/forms.py b/scanpipe/forms.py index f854235aa..ffbb01828 100644 --- a/scanpipe/forms.py +++ b/scanpipe/forms.py @@ -25,6 +25,7 @@ from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ValidationError +from packageurl import PackageURL from taggit.forms import TagField from taggit.forms import TagWidget @@ -458,12 +459,26 @@ class Meta: fields = [ "name", "notes", + "project_purl", ] widgets = { "name": forms.TextInput(attrs={"class": "input"}), "notes": forms.Textarea(attrs={"rows": 3, "class": "textarea is-dynamic"}), + "project_purl": forms.TextInput(attrs={"class": "input"}), } + def clean_project_purl(self): + """Validate the Project PURL.""" + project_purl = self.cleaned_data.get("project_purl") + + if project_purl: + try: + PackageURL.from_string(project_purl) + except ValueError: + raise forms.ValidationError("Project PURL must be a valid PackageURL") + + return project_purl + def __init__(self, *args, **kwargs): """Load initial values from Project ``settings`` field.""" super().__init__(*args, **kwargs) diff --git a/scanpipe/migrations/0068_project_project_purl.py b/scanpipe/migrations/0068_project_project_purl.py new file mode 100644 index 000000000..5d55137af --- /dev/null +++ b/scanpipe/migrations/0068_project_project_purl.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.7 on 2024-10-22 14:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('scanpipe', '0067_discoveredpackage_notes'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='project_purl', + field=models.CharField(blank=True, help_text='Project Package URL.', max_length=2048), + ), + ] diff --git a/scanpipe/models.py b/scanpipe/models.py index f54395b05..67abdf674 100644 --- a/scanpipe/models.py +++ b/scanpipe/models.py @@ -561,6 +561,11 @@ class Project(UUIDPKModel, ExtraDataFieldMixin, UpdateMixin, models.Model): notes = models.TextField(blank=True) settings = models.JSONField(default=dict, blank=True) labels = TaggableManager(through=UUIDTaggedItem) + project_purl = models.CharField( + max_length=2048, + blank=True, + help_text=_("Project Package URL."), + ) objects = ProjectQuerySet.as_manager() @@ -704,6 +709,7 @@ def clone( """Clone this project using the provided ``clone_name`` as new project name.""" new_project = Project.objects.create( name=clone_name, + project_purl=self.project_purl, settings=self.settings if copy_settings else {}, ) diff --git a/scanpipe/templates/scanpipe/project_settings.html b/scanpipe/templates/scanpipe/project_settings.html index d2ec52f58..b96ca8242 100644 --- a/scanpipe/templates/scanpipe/project_settings.html +++ b/scanpipe/templates/scanpipe/project_settings.html @@ -26,6 +26,14 @@ {{ form.name }} +
+ +
+ {{ form.project_purl }} +
+