Skip to content

Commit a1f0005

Browse files
optimize asyn_dupe_delete grading
1 parent fdcd1ec commit a1f0005

2 files changed

Lines changed: 30 additions & 16 deletions

File tree

dojo/models.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2254,15 +2254,16 @@ def hash_code_allows_null_cwe(self):
22542254
deduplicationLogger.debug(f"HASHCODE_ALLOWS_NULL_CWE is: {hashCodeAllowsNullCwe}")
22552255
return hashCodeAllowsNullCwe
22562256

2257-
def delete(self, *args, **kwargs):
2257+
def delete(self, *args, product_grading_option=True, **kwargs):
22582258
logger.debug("%d test delete", self.id)
22592259
super().delete(*args, **kwargs)
2260-
with suppress(Test.DoesNotExist, Engagement.DoesNotExist, Product.DoesNotExist):
2261-
# Suppressing a potential issue created from async delete removing
2262-
# related objects in a separate task
2263-
system_settings = System_Settings.objects.get()
2264-
if system_settings.enable_product_grade:
2265-
calculate_grade(self.engagement.product)
2260+
if product_grading_option:
2261+
with suppress(Test.DoesNotExist, Engagement.DoesNotExist, Product.DoesNotExist):
2262+
# Suppressing a potential issue created from async delete removing
2263+
# related objects in a separate task
2264+
system_settings = System_Settings.objects.get()
2265+
if system_settings.enable_product_grade:
2266+
calculate_grade(self.engagement.product)
22662267

22672268
@property
22682269
def statistics(self):
@@ -2863,17 +2864,18 @@ def copy(self, test=None):
28632864

28642865
return copy
28652866

2866-
def delete(self, *args, **kwargs):
2867+
def delete(self, *args, product_grading_option=True, **kwargs):
28672868
logger.debug("%d finding delete", self.id)
28682869
from dojo.finding import helper
28692870
helper.finding_delete(self)
28702871
super().delete(*args, **kwargs)
2871-
with suppress(Finding.DoesNotExist, Test.DoesNotExist, Engagement.DoesNotExist, Product.DoesNotExist):
2872-
# Suppressing a potential issue created from async delete removing
2873-
# related objects in a separate task
2874-
system_settings = System_Settings.objects.get()
2875-
if system_settings.enable_product_grade:
2876-
calculate_grade(self.test.engagement.product)
2872+
if product_grading_option:
2873+
with suppress(Finding.DoesNotExist, Test.DoesNotExist, Engagement.DoesNotExist, Product.DoesNotExist):
2874+
# Suppressing a potential issue created from async delete removing
2875+
# related objects in a separate task
2876+
system_settings = System_Settings.objects.get()
2877+
if system_settings.enable_product_grade:
2878+
calculate_grade(self.test.engagement.product)
28772879

28782880
# only used by bulk risk acceptance api
28792881
@classmethod

dojo/tasks.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def async_dupe_delete(*args, **kwargs):
129129
logger.info("delete excess duplicates (max_dupes per finding: %s, max deletes per run: %s)", dupe_max, total_duplicate_delete_count_max_per_run)
130130
deduplicationLogger.info("delete excess duplicates (max_dupes per finding: %s, max deletes per run: %s)", dupe_max, total_duplicate_delete_count_max_per_run)
131131

132-
# limit to 100 to prevent overlapping jobs
132+
# limit to settings.DUPE_DELETE_MAX_PER_RUN to prevent overlapping jobs
133133
results = Finding.objects \
134134
.filter(duplicate=True) \
135135
.order_by() \
@@ -146,13 +146,17 @@ def async_dupe_delete(*args, **kwargs):
146146
queryset=Finding.objects.filter(duplicate=True).order_by("date")))
147147

148148
total_deleted_count = 0
149+
affected_products = set()
149150
for original in originals_with_too_many_duplicates:
150151
duplicate_list = original.original_finding.all()
151152
dupe_count = len(duplicate_list) - dupe_max
152153

153154
for finding in duplicate_list:
154155
deduplicationLogger.debug(f"deleting finding {finding.id}:{finding.title} ({finding.hash_code}))")
155-
finding.delete()
156+
# Collect the product for batch grading later
157+
affected_products.add(finding.test.engagement.product)
158+
# Skip individual product grading during deletion
159+
finding.delete(product_grading_option=False)
156160
total_deleted_count += 1
157161
dupe_count -= 1
158162
if dupe_count <= 0:
@@ -165,6 +169,14 @@ def async_dupe_delete(*args, **kwargs):
165169

166170
logger.info("total number of excess duplicates deleted: %s", total_deleted_count)
167171

172+
# Batch product grading for all affected products
173+
if affected_products:
174+
system_settings = System_Settings.objects.get()
175+
if system_settings.enable_product_grade:
176+
logger.info("performing batch product grading for %s products", len(affected_products))
177+
for product in affected_products:
178+
calculate_grade(product)
179+
168180

169181
@app.task(ignore_result=False)
170182
def celery_status():

0 commit comments

Comments
 (0)