Skip to content

Commit cb94f97

Browse files
committed
plug signals to evaluate rules
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent 4ca34f5 commit cb94f97

4 files changed

Lines changed: 34 additions & 12 deletions

File tree

policy/signals.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,37 @@
88

99
import logging
1010

11+
from django.db.models.signals import post_delete
1112
from django.db.models.signals import post_save
1213
from django.dispatch import receiver
1314

15+
from policy.tasks import evaluate_all_products_rules_task
1416
from policy.tasks import evaluate_product_rules_task
1517

1618
logger = logging.getLogger(__name__)
1719

1820

1921
@receiver(post_save, sender="product_portfolio.Product")
20-
def evaluate_product_rules_on_save(sender, instance, **kwargs):
22+
def evaluate_product_rules_on_product_save(sender, instance, **kwargs):
2123
"""Queue a policy rule evaluation whenever a product is saved."""
22-
logger.debug(f"Queuing policy rule evaluation for product {instance.uuid}")
2324
evaluate_product_rules_task.delay(product_uuid=instance.uuid)
25+
26+
27+
@receiver(post_save, sender="product_portfolio.ProductPackage")
28+
def evaluate_product_rules_on_productpackage_save(sender, instance, **kwargs):
29+
"""Queue a policy rule evaluation whenever a package is added or updated in a product."""
30+
evaluate_product_rules_task.delay(product_uuid=instance.product.uuid)
31+
32+
33+
@receiver(post_delete, sender="product_portfolio.ProductPackage")
34+
def evaluate_product_rules_on_productpackage_delete(sender, instance, **kwargs):
35+
"""Queue a policy rule evaluation whenever a package is removed from a product."""
36+
evaluate_product_rules_task.delay(product_uuid=instance.product.uuid)
37+
38+
39+
@receiver(post_save, sender="component_catalog.Package")
40+
def evaluate_product_rules_on_package_save(sender, instance, **kwargs):
41+
"""Queue a policy rule evaluation for all products containing this package."""
42+
product_uuids = list(instance.productpackages.values_list("product__uuid", flat=True))
43+
if product_uuids:
44+
evaluate_all_products_rules_task.delay(product_uuids=product_uuids)

policy/tasks.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,17 @@ def evaluate_product_rules_task(product_uuid):
5959

6060

6161
@job
62-
def evaluate_all_products_rules_task(include_locked=False):
63-
"""Evaluate policy rules for every product directly, skipping locked ones by default."""
62+
def evaluate_all_products_rules_task(include_locked=False, product_uuids=None):
63+
"""
64+
Evaluate policy rules for products, skipping locked ones by default.
65+
When product_uuids is provided, only those products are evaluated.
66+
"""
6467
Product = apps.get_model("product_portfolio", "product")
6568

6669
products = get_unsecured_manager(Product).select_related("dataspace")
67-
if not include_locked:
70+
if product_uuids is not None:
71+
products = products.filter(uuid__in=product_uuids)
72+
elif not include_locked:
6873
products = products.exclude_locked()
6974

7075
count = products.count()

product_portfolio/models.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,6 @@ def save(self, *args, **kwargs):
442442
if self.has_changed("configuration_status_id"):
443443
self.actions_on_status_change()
444444

445-
from policy.engine import evaluate_rules
446-
447-
evaluate_rules(product=self)
448-
449445
def get_attribution_url(self):
450446
return self.get_url("attribution")
451447

product_portfolio/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@
112112
from license_library.filters import LicenseFilterSet
113113
from license_library.models import License
114114
from license_library.models import LicenseAssignedTag
115+
from policy.engine import evaluate_rules
116+
from policy.engine import get_effective_config
117+
from policy.rules import RULE_REGISTRY
115118
from product_portfolio.filters import CodebaseResourceFilterSet
116119
from product_portfolio.filters import DependencyFilterSet
117120
from product_portfolio.filters import ProductComponentFilterSet
@@ -143,9 +146,6 @@
143146
from product_portfolio.models import ScanCodeProject
144147
from product_portfolio.tasks import improve_packages_from_purldb_task
145148
from product_portfolio.tasks import pull_project_data_from_scancodeio_task
146-
from policy.engine import evaluate_rules
147-
from policy.engine import get_effective_config
148-
from policy.rules import RULE_REGISTRY
149149
from vulnerabilities.forms import VulnerabilityAnalysisForm
150150
from vulnerabilities.models import AffectedByVulnerabilityMixin
151151
from vulnerabilities.models import Vulnerability

0 commit comments

Comments
 (0)