Skip to content

Commit 4ca34f5

Browse files
committed
add ability to re-evaluate rules
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent 5065b58 commit 4ca34f5

4 files changed

Lines changed: 73 additions & 33 deletions

File tree

product_portfolio/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,9 @@ def get_export_license_compliance_url(self):
491491
def get_export_security_compliance_url(self):
492492
return self.get_url("export_security_compliance")
493493

494+
def get_evaluate_policy_rules_url(self):
495+
return self.get_url("evaluate_policy_rules")
496+
494497
@property
495498
def cyclonedx_bom_ref(self):
496499
return str(self.uuid)

product_portfolio/templates/product_portfolio/compliance/compliance_panels.html

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,47 +16,63 @@ <h3 class="fs-6 fw-medium mb-0">{% trans "Policy violations" %}</h3>
1616
<i class="fas fa-circle-info small"></i>
1717
</button>
1818
</div>
19+
<div class="d-flex align-items-center gap-2">
20+
{% if has_change_permission %}
21+
<form hx-post="{{ product.get_evaluate_policy_rules_url }}"
22+
hx-swap="none"
23+
hx-on--before-request="NEXB.displayOverlay('{% trans "Re-evaluating policy rules..." %}')">
24+
{% csrf_token %}
25+
<button type="submit"
26+
class="btn btn-link p-0 text-body-tertiary lh-1"
27+
data-bs-toggle="tooltip"
28+
data-bs-title="{% trans 'Re-evaluate policy rules' %}"
29+
aria-label="{% trans 'Re-evaluate policy rules' %}">
30+
<i class="fas fa-rotate-right small pb-1"></i>
31+
</button>
32+
</form>
33+
{% endif %}
34+
<span class="badge bg-danger-subtle text-danger-emphasis">
35+
{{ policy_violation_count }} {% trans "active" %}
36+
</span>
37+
</div>
38+
</div>
1939

20-
<div class="modal fade" id="active-rules-modal" tabindex="-1" aria-labelledby="active-rules-modal-label" aria-hidden="true">
21-
<div class="modal-dialog">
22-
<div class="modal-content">
23-
<div class="modal-header">
24-
<h5 class="modal-title fs-6 fw-medium" id="active-rules-modal-label">{% trans "Active rules" %}</h5>
25-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
26-
</div>
27-
<div class="modal-body p-0">
28-
{% for rule in all_rules %}
29-
<div class="d-flex align-items-start justify-content-between px-3 py-3 {% if not forloop.last %}border-bottom{% endif %}">
30-
<div class="me-3">
40+
<div class="modal fade" id="active-rules-modal" tabindex="-1" aria-labelledby="active-rules-modal-label" aria-hidden="true">
41+
<div class="modal-dialog">
42+
<div class="modal-content">
43+
<div class="modal-header">
44+
<h5 class="modal-title fs-6 fw-medium" id="active-rules-modal-label">{% trans "Active rules" %}</h5>
45+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
46+
</div>
47+
<div class="modal-body p-0">
48+
{% for rule in all_rules %}
49+
<div class="d-flex align-items-start justify-content-between px-3 py-3 {% if not forloop.last %}border-bottom{% endif %}">
50+
<div class="me-3">
51+
{% if rule.severity == "error" %}
52+
<span class="badge bg-danger-subtle text-danger-emphasis mb-1">{{ rule.label }}</span>
53+
{% else %}
54+
<span class="badge bg-warning-subtle text-warning-emphasis mb-1">{{ rule.label }}</span>
55+
{% endif %}
56+
<div class="text-body-secondary small">{{ rule.description }}</div>
57+
</div>
58+
<div class="flex-shrink-0">
59+
{% if not rule.is_active %}
60+
<span class="badge text-bg-secondary">{% trans "Disabled" %}</span>
61+
{% elif rule.is_violated %}
3162
{% if rule.severity == "error" %}
32-
<span class="badge bg-danger-subtle text-danger-emphasis mb-1">{{ rule.label }}</span>
33-
{% else %}
34-
<span class="badge bg-warning-subtle text-warning-emphasis mb-1">{{ rule.label }}</span>
35-
{% endif %}
36-
<div class="text-body-secondary small">{{ rule.description }}</div>
37-
</div>
38-
<div class="flex-shrink-0">
39-
{% if not rule.is_active %}
40-
<span class="badge text-bg-secondary">{% trans "Disabled" %}</span>
41-
{% elif rule.is_violated %}
42-
{% if rule.severity == "error" %}
43-
<span class="badge bg-danger-subtle text-danger-emphasis">{% trans "Triggered" %}</span>
44-
{% else %}
45-
<span class="badge bg-warning-subtle text-warning-emphasis">{% trans "Triggered" %}</span>
46-
{% endif %}
63+
<span class="badge bg-danger-subtle text-danger-emphasis">{% trans "Triggered" %}</span>
4764
{% else %}
48-
<span class="badge bg-success-subtle text-success-emphasis">{% trans "OK" %}</span>
65+
<span class="badge bg-warning-subtle text-warning-emphasis">{% trans "Triggered" %}</span>
4966
{% endif %}
50-
</div>
67+
{% else %}
68+
<span class="badge bg-success-subtle text-success-emphasis">{% trans "OK" %}</span>
69+
{% endif %}
5170
</div>
52-
{% endfor %}
53-
</div>
71+
</div>
72+
{% endfor %}
5473
</div>
5574
</div>
5675
</div>
57-
<span class="badge bg-danger-subtle text-danger-emphasis">
58-
{{ policy_violation_count }} {% trans "active" %}
59-
</span>
6076
</div>
6177
<table class="table table-sm align-middle mb-0">
6278
<thead>

product_portfolio/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from product_portfolio.views import check_package_version_ajax_view
4343
from product_portfolio.views import delete_scan_htmx_view
4444
from product_portfolio.views import edit_productrelation_ajax_view
45+
from product_portfolio.views import evaluate_policy_rules_view
4546
from product_portfolio.views import import_from_scan_view
4647
from product_portfolio.views import import_packages_from_scancodeio_view
4748
from product_portfolio.views import improve_packages_from_purldb_view
@@ -129,6 +130,7 @@ def product_path(path_segment, view):
129130
*product_path("add_customcomponent_ajax", add_customcomponent_ajax_view),
130131
*product_path("vulnerability_analysis_form", vulnerability_analysis_form_view),
131132
*product_path("scan_all_packages", scan_all_packages_view),
133+
*product_path("evaluate_policy_rules", evaluate_policy_rules_view),
132134
*product_path("improve_packages_from_purldb", improve_packages_from_purldb_view),
133135
*product_path("about_files", ProductSendAboutFilesView.as_view()),
134136
*product_path("export_spdx", ProductExportSPDXDocumentView.as_view()),

product_portfolio/views.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
from product_portfolio.models import ScanCodeProject
144144
from product_portfolio.tasks import improve_packages_from_purldb_task
145145
from product_portfolio.tasks import pull_project_data_from_scancodeio_task
146+
from policy.engine import evaluate_rules
146147
from policy.engine import get_effective_config
147148
from policy.rules import RULE_REGISTRY
148149
from vulnerabilities.forms import VulnerabilityAnalysisForm
@@ -2068,6 +2069,22 @@ def scan_all_packages_view(request, dataspace, name, version=""):
20682069
return redirect(product)
20692070

20702071

2072+
@require_POST
2073+
@login_required
2074+
def evaluate_policy_rules_view(request, dataspace, name, version=""):
2075+
guarded_qs = Product.objects.get_queryset(request.user, perms="change_product")
2076+
product = get_object_or_404(
2077+
guarded_qs,
2078+
name=unquote_plus(name),
2079+
version=unquote_plus(version),
2080+
dataspace__name=dataspace,
2081+
)
2082+
2083+
evaluate_rules(product)
2084+
2085+
return HttpResponse(headers={"HX-Refresh": "true"})
2086+
2087+
20712088
@login_required
20722089
def import_from_scan_view(request, dataspace, name, version=""):
20732090
"""
@@ -2771,13 +2788,15 @@ def get_context_data(self, **kwargs):
27712788
product = self.object
27722789
productpackages = product.productpackages.all()
27732790
licenses = License.objects.filter(productpackage__in=productpackages)
2791+
user_perms = guardian_get_perms(self.request.user, product)
27742792

27752793
context.update(
27762794
{
27772795
**self.get_package_compliance_context(productpackages),
27782796
**self.get_license_compliance_context(licenses),
27792797
**self.get_security_compliance_context(product),
27802798
**self.get_policy_compliance_context(product),
2799+
"has_change_permission": "change_product" in user_perms,
27812800
}
27822801
)
27832802

0 commit comments

Comments
 (0)