Skip to content

Commit 8cc8cef

Browse files
valentijnscholtenMaffooch
authored andcommitted
sla_config: use mass update for recalculation (#12133)
* sla_config_updater: add logging * sla_config: use mass update on changes * sla_config: use mass update on changes * sla_config: use mass update on changes * sla_config: use mass update on changes * sla_config: use mass update on changes * sla_config: use mass update on changes * sla_config: use mass update on changes * sla_config: use mass update on changes * cleanup
1 parent 410d0b9 commit 8cc8cef

File tree

4 files changed

+38
-35
lines changed

4 files changed

+38
-35
lines changed

dojo/models.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ def save(self, *args, **kwargs):
10531053
super(Product, product).save()
10541054
# launch the async task to update all finding sla expiration dates
10551055
from dojo.sla_config.helpers import update_sla_expiration_dates_sla_config_async
1056-
update_sla_expiration_dates_sla_config_async(self, tuple(severities), products)
1056+
update_sla_expiration_dates_sla_config_async(self, products, tuple(severities))
10571057

10581058
def clean(self):
10591059
sla_days = [self.critical, self.high, self.medium, self.low]
@@ -1214,7 +1214,7 @@ def save(self, *args, **kwargs):
12141214
sla_config.async_updating = True
12151215
super(SLA_Configuration, sla_config).save()
12161216
# launch the async task to update all finding sla expiration dates
1217-
from dojo.product.helpers import update_sla_expiration_dates_product_async
1217+
from dojo.sla_config.helpers import update_sla_expiration_dates_product_async
12181218
update_sla_expiration_dates_product_async(self, sla_config)
12191219

12201220
def get_absolute_url(self):
@@ -2679,6 +2679,7 @@ def __str__(self):
26792679

26802680
def save(self, dedupe_option=True, rules_option=True, product_grading_option=True, # noqa: FBT002
26812681
issue_updater_option=True, push_to_jira=False, user=None, *args, **kwargs): # noqa: FBT002 - this is bit hard to fix nice have this universally fixed
2682+
logger.debug("Start saving finding of id " + str(self.id) + " dedupe_option:" + str(dedupe_option) + " (self.pk is %s)", "None" if self.pk is None else "not None")
26822683

26832684
from dojo.finding import helper as finding_helper
26842685

@@ -3043,7 +3044,7 @@ def get_sla_start_date(self):
30433044
return self.date
30443045

30453046
def get_sla_period(self):
3046-
sla_configuration = SLA_Configuration.objects.filter(id=self.test.engagement.product.sla_configuration_id).first()
3047+
sla_configuration = self.test.engagement.product.sla_configuration
30473048
sla_period = getattr(sla_configuration, self.severity.lower(), None)
30483049
enforce_period = getattr(sla_configuration, str("enforce_" + self.severity.lower()), None)
30493050
return sla_period, enforce_period
@@ -3140,6 +3141,7 @@ def has_finding_group(self):
31403141
return self.finding_group is not None
31413142

31423143
def save_no_options(self, *args, **kwargs):
3144+
logger.debug("save_no_options")
31433145
return self.save(dedupe_option=False, rules_option=False, product_grading_option=False,
31443146
issue_updater_option=False, push_to_jira=False, user=None, *args, **kwargs)
31453147

dojo/product/helpers.py

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,11 @@
33

44
from dojo.celery import app
55
from dojo.decorators import dojo_async_task
6-
from dojo.models import Endpoint, Engagement, Finding, Product, SLA_Configuration, Test
6+
from dojo.models import Endpoint, Engagement, Finding, Product, Test
77

88
logger = logging.getLogger(__name__)
99

1010

11-
@dojo_async_task
12-
@app.task
13-
def update_sla_expiration_dates_product_async(product, sla_config, *args, **kwargs):
14-
update_sla_expiration_dates_product_sync(product, sla_config)
15-
16-
17-
def update_sla_expiration_dates_product_sync(product, sla_config):
18-
logger.info(f"Updating finding SLA expiration dates within product {product}")
19-
# update each finding that is within the SLA configuration that was saved
20-
for f in Finding.objects.filter(test__engagement__product=product):
21-
f.save()
22-
# reset the async updating flag to false for the sla config assigned to this product
23-
if sla_config:
24-
sla_config.async_updating = False
25-
super(SLA_Configuration, sla_config).save()
26-
# set the async updating flag to false for the sla config assigned to this product
27-
product.async_updating = False
28-
super(Product, product).save()
29-
30-
3111
@dojo_async_task
3212
@app.task
3313
def propagate_tags_on_product(product_id, *args, **kwargs):

dojo/sla_config/helpers.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,50 @@
33
from dojo.celery import app
44
from dojo.decorators import dojo_async_task
55
from dojo.models import Finding, Product, SLA_Configuration
6+
from dojo.utils import calculate_grade, mass_model_updater
67

78
logger = logging.getLogger(__name__)
89

910

1011
@dojo_async_task
1112
@app.task
12-
def update_sla_expiration_dates_sla_config_async(sla_config, severities, products, *args, **kwargs):
13-
update_sla_expiration_dates_sla_config_sync(sla_config, severities, products)
13+
def update_sla_expiration_dates_sla_config_async(sla_config, products, severities, *args, **kwargs):
14+
update_sla_expiration_dates_sla_config_sync(sla_config, products, severities)
1415

1516

16-
def update_sla_expiration_dates_sla_config_sync(sla_config, severities, products):
17+
@dojo_async_task
18+
@app.task
19+
def update_sla_expiration_dates_product_async(product, sla_config, *args, **kwargs):
20+
update_sla_expiration_dates_sla_config_sync(sla_config, [product])
21+
22+
23+
def update_sla_expiration_dates_sla_config_sync(sla_config, products, severities=None):
1724
logger.info(f"Updating finding SLA expiration dates within the {sla_config} SLA configuration")
1825
# update each finding that is within the SLA configuration that was saved
19-
for f in Finding.objects.filter(test__engagement__product__sla_configuration_id=sla_config.id, severity__in=severities):
20-
f.save()
26+
findings = Finding.objects.filter(test__engagement__product__sla_configuration_id=sla_config.id)
27+
if products:
28+
findings = findings.filter(test__engagement__product__in=products)
29+
if severities:
30+
findings = findings.filter(severity__in=severities)
31+
32+
findings = findings.prefetch_related(
33+
"test",
34+
"test__engagement",
35+
"test__engagement__product",
36+
"test__engagement__product__sla_configuration",
37+
)
38+
39+
findings = findings.order_by("id").only("id", "sla_start_date", "date", "severity", "test")
40+
41+
mass_model_updater(Finding, findings, lambda f: f.set_sla_expiration_date(), fields=["sla_expiration_date"])
42+
2143
# reset the async updating flag to false for all products using this sla config
2244
for product in products:
2345
product.async_updating = False
2446
super(Product, product).save()
47+
calculate_grade(product)
48+
2549
# reset the async updating flag to false for this sla config
2650
sla_config.async_updating = False
2751
super(SLA_Configuration, sla_config).save()
52+
logger.info(f"DONE Updating finding SLA expiration dates within the {sla_config} SLA configuration")

dojo/utils.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2241,22 +2241,18 @@ def mass_model_updater(model_type, models, function, fields, page_size=1000, ord
22412241
i = 0
22422242
batch = []
22432243
total_pages = (total_count // page_size) + 2
2244-
# logger.info('pages to process: %d', total_pages)
2244+
# logger.debug("pages to process: %d", total_pages)
22452245
logger.debug("%s%s out of %s models processed ...", log_prefix, i, total_count)
22462246
for _p in range(1, total_pages):
2247-
# logger.info('page: %d', p)
22482247
if order == "asc":
22492248
page = models.filter(id__gt=last_id)[:page_size]
22502249
else:
22512250
page = models.filter(id__lt=last_id)[:page_size]
22522251

2253-
# logger.info('page query: %s', page.query)
2254-
# if p == 23:
2255-
# raise ValueError('bla')
2252+
logger.debug("page query: %s", page.query)
22562253
for model in page:
22572254
i += 1
22582255
last_id = model.id
2259-
# logger.info('last_id: %s', last_id)
22602256

22612257
function(model)
22622258

0 commit comments

Comments
 (0)