Skip to content

Commit

Permalink
Add support for rendering any expression as SPDX #63
Browse files Browse the repository at this point in the history
Signed-off-by: tdruez <tdruez@nexb.com>
  • Loading branch information
tdruez committed Jun 28, 2024
1 parent 3f8e268 commit 111edd7
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 4 deletions.
12 changes: 10 additions & 2 deletions component_catalog/license_expression_dje.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,9 +426,17 @@ def get_formatted_expression(licensing, license_expression, show_policy, show_ca
)


def render_expression_for_ui(expression_str, dataspace):
def render_expression_as_html(expression, dataspace):
"""Return the ``expression`` as rendered HTML content."""
show_policy = dataspace.show_usage_policy_in_user_views
licensing = get_dataspace_licensing(dataspace)

formatted_expression = get_formatted_expression(licensing, expression_str, show_policy)
formatted_expression = get_formatted_expression(licensing, expression, show_policy)
return format_html(formatted_expression)


def get_expression_as_spdx(expression, dataspace):
"""Return an SPDX license expression built from the ``expression``."""
licensing = get_dataspace_licensing(dataspace)
parsed_expression = parse_expression(expression, licensing)
return parsed_expression.render(template="{symbol.spdx_license_key}")
20 changes: 20 additions & 0 deletions component_catalog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
from packageurl.contrib.django.utils import without_empty_values

from component_catalog.license_expression_dje import build_licensing
from component_catalog.license_expression_dje import get_expression_as_spdx
from component_catalog.license_expression_dje import get_license_objects
from component_catalog.license_expression_dje import parse_expression
from dejacode_toolkit import spdx
Expand Down Expand Up @@ -196,6 +197,9 @@ def get_license_expression_spdx_id(self):
"LicenseRef-".
See discussion at https://github.com/spdx/tools-java/issues/73
Note: A new get_expression_as_spdx function is available and should be used in
place of this one.
"""
expression = self.get_license_expression("{symbol.spdx_id}")
if expression:
Expand All @@ -215,6 +219,14 @@ def _get_primary_license(self):

primary_license = cached_property(_get_primary_license)

def get_expression_as_spdx(self, expression):
if expression:
return get_expression_as_spdx(expression, self.dataspace)

@property
def concluded_license_expression_spdx(self):
return self.get_expression_as_spdx(self.license_expression)

def save(self, *args, **kwargs):
"""
Call the handle_assigned_licenses method on save, except during copy.
Expand Down Expand Up @@ -341,6 +353,14 @@ class LicenseFieldsMixin(models.Model):
class Meta:
abstract = True

@property
def declared_license_expression_spdx(self):
return self.get_expression_as_spdx(self.declared_license_expression)

@property
def other_license_expression_spdx(self):
return self.get_expression_as_spdx(self.other_license_expression)


def get_cyclonedx_properties(instance):
"""
Expand Down
4 changes: 2 additions & 2 deletions dje/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
from notifications import views as notifications_views

from component_catalog.license_expression_dje import get_license_objects
from component_catalog.license_expression_dje import render_expression_for_ui
from component_catalog.license_expression_dje import render_expression_as_html
from dejacode_toolkit.purldb import PurlDB
from dejacode_toolkit.scancodeio import ScanCodeIO
from dejacode_toolkit.vulnerablecode import VulnerableCode
Expand Down Expand Up @@ -916,7 +916,7 @@ def tab_license(self):

for license_field in license_fields:
if expression := getattr(obj, license_field, None):
rendered_expression = render_expression_for_ui(expression, obj.dataspace)
rendered_expression = render_expression_as_html(expression, obj.dataspace)
tab_fields.append(TabField(license_field, value=rendered_expression))

if getattr(obj, "reference_notes", False):
Expand Down
6 changes: 6 additions & 0 deletions reporting/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,9 @@ def get_model_data_for_column_template(dataspace=None):
"Properties": [
"urn",
"details_url",
"concluded_license_expression_spdx",
"declared_license_expression_spdx",
"other_license_expression_spdx",
"primary_license",
"attribution_required",
"redistribution_required",
Expand All @@ -201,6 +204,9 @@ def get_model_data_for_column_template(dataspace=None):
"identifier",
"urn",
"details_url",
"concluded_license_expression_spdx",
"declared_license_expression_spdx",
"other_license_expression_spdx",
"primary_license",
"attribution_required",
"redistribution_required",
Expand Down
15 changes: 15 additions & 0 deletions reporting/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2059,6 +2059,21 @@ def test_get_model_data_for_component_column_template(self):
{"group": "Related Fields", "label": "related_parents", "value": "related_parents"},
{"group": "Properties", "label": "urn", "value": "urn"},
{"group": "Properties", "label": "details_url", "value": "details_url"},
{
"group": "Properties",
"label": "concluded_license_expression_spdx",
"value": "concluded_license_expression_spdx",
},
{
"group": "Properties",
"label": "declared_license_expression_spdx",
"value": "declared_license_expression_spdx",
},
{
"group": "Properties",
"label": "other_license_expression_spdx",
"value": "other_license_expression_spdx",
},
{"group": "Properties", "value": "primary_license", "label": "primary_license"},
{
"group": "Properties",
Expand Down

0 comments on commit 111edd7

Please sign in to comment.