Skip to content

Commit f11a362

Browse files
remove dojo_model_to/from_id decorator (#13984)
* remove dojo_model_to/from_id decorator * remove dojo_model_from/to_id * remove dojo_model_from/to_id * remove dojo_model_from/to_id * remove dojo_model_from/to_id * fix tests * remove leftover signature methods * fix test counts * fix test counts * fix test counts * Update dojo/settings/settings.dist.py Co-authored-by: Cody Maffucci <46459665+Maffooch@users.noreply.github.com> * fix test --------- Co-authored-by: Cody Maffucci <46459665+Maffooch@users.noreply.github.com>
1 parent 89877d9 commit f11a362

27 files changed

Lines changed: 468 additions & 431 deletions

dojo/api_v2/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,13 +678,13 @@ def update_jira_epic(self, request, pk=None):
678678
try:
679679

680680
if engagement.has_jira_issue:
681-
jira_helper.update_epic(engagement, **request.data)
681+
jira_helper.update_epic(engagement.id, **request.data)
682682
response = Response(
683683
{"info": "Jira Epic update query sent"},
684684
status=status.HTTP_200_OK,
685685
)
686686
else:
687-
jira_helper.add_epic(engagement, **request.data)
687+
jira_helper.add_epic(engagement.id, **request.data)
688688
response = Response(
689689
{"info": "Jira Epic create query sent"},
690690
status=status.HTTP_200_OK,

dojo/decorators.py

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
from functools import wraps
44

55
from django.conf import settings
6-
from django.db import models
76
from django_ratelimit import UNSAFE
87
from django_ratelimit.core import is_ratelimited
98
from django_ratelimit.exceptions import Ratelimited
109

11-
from dojo.models import Dojo_User, Finding
10+
from dojo.models import Dojo_User
1211

1312
logger = logging.getLogger(__name__)
1413

@@ -116,81 +115,6 @@ def __wrapper__(*args, **kwargs):
116115
return decorator(func)
117116

118117

119-
# decorator with parameters needs another wrapper layer
120-
# example usage: @dojo_model_to_id(parameter=0) but defaults to parameter=0
121-
def dojo_model_to_id(_func=None, *, parameter=0):
122-
# logger.debug('dec_args:' + str(dec_args))
123-
# logger.debug('dec_kwargs:' + str(dec_kwargs))
124-
# logger.debug('_func:%s', _func)
125-
126-
def dojo_model_to_id_internal(func, *args, **kwargs):
127-
@wraps(func)
128-
def __wrapper__(*args, **kwargs):
129-
if not settings.CELERY_PASS_MODEL_BY_ID:
130-
return func(*args, **kwargs)
131-
132-
model_or_id = get_parameter_froms_args_kwargs(args, kwargs, parameter)
133-
134-
if model_or_id:
135-
if isinstance(model_or_id, models.Model) and we_want_async(*args, func=func, **kwargs):
136-
logger.debug("converting model_or_id to id: %s", model_or_id)
137-
args = list(args)
138-
args[parameter] = model_or_id.id
139-
140-
return func(*args, **kwargs)
141-
142-
return __wrapper__
143-
144-
if _func is None:
145-
# decorator called without parameters
146-
return dojo_model_to_id_internal
147-
return dojo_model_to_id_internal(_func)
148-
149-
150-
# decorator with parameters needs another wrapper layer
151-
# example usage: @dojo_model_from_id(parameter=0, model=Finding) but defaults to parameter 0 and model Finding
152-
def dojo_model_from_id(_func=None, *, model=Finding, parameter=0):
153-
# logger.debug('dec_args:' + str(dec_args))
154-
# logger.debug('dec_kwargs:' + str(dec_kwargs))
155-
# logger.debug('_func:%s', _func)
156-
# logger.debug('model: %s', model)
157-
158-
def dojo_model_from_id_internal(func, *args, **kwargs):
159-
@wraps(func)
160-
def __wrapper__(*args, **kwargs):
161-
if not settings.CELERY_PASS_MODEL_BY_ID:
162-
return func(*args, **kwargs)
163-
164-
logger.debug("args:" + str(args))
165-
logger.debug("kwargs:" + str(kwargs))
166-
167-
logger.debug("checking if we need to convert id to model: %s for parameter: %s", model.__name__, parameter)
168-
169-
model_or_id = get_parameter_froms_args_kwargs(args, kwargs, parameter)
170-
171-
if model_or_id:
172-
if not isinstance(model_or_id, models.Model) and we_want_async(*args, func=func, **kwargs):
173-
logger.debug("instantiating model_or_id: %s for model: %s", model_or_id, model)
174-
try:
175-
instance = model.objects.get(id=model_or_id)
176-
except model.DoesNotExist:
177-
logger.warning("error instantiating model_or_id: %s for model: %s: DoesNotExist", model_or_id, model)
178-
instance = None
179-
args = list(args)
180-
args[parameter] = instance
181-
else:
182-
logger.debug("model_or_id already a model instance %s for model: %s", model_or_id, model)
183-
184-
return func(*args, **kwargs)
185-
186-
return __wrapper__
187-
188-
if _func is None:
189-
# decorator called without parameters
190-
return dojo_model_from_id_internal
191-
return dojo_model_from_id_internal(_func)
192-
193-
194118
def get_parameter_froms_args_kwargs(args, kwargs, parameter):
195119
model_or_id = None
196120
if isinstance(parameter, int):

dojo/endpoint/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ def endpoint_bulk_update_all(request, pid=None):
373373
product_calc = list(Product.objects.filter(endpoint__id__in=endpoints_to_update).distinct())
374374
endpoints.delete()
375375
for prod in product_calc:
376-
calculate_grade(prod)
376+
calculate_grade(prod.id)
377377

378378
if skipped_endpoint_count > 0:
379379
add_error_message_to_response(f"Skipped deletion of {skipped_endpoint_count} endpoints because you are not authorized.")

dojo/engagement/services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def close_engagement(eng):
1616
eng.save()
1717

1818
if jira_helper.get_jira_project(eng):
19-
jira_helper.close_epic(eng, push_to_jira=True)
19+
jira_helper.close_epic(eng.id, push_to_jira=True)
2020

2121

2222
def reopen_engagement(eng):

dojo/engagement/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ def copy_engagement(request, eid):
390390
form = DoneForm(request.POST)
391391
if form.is_valid():
392392
engagement_copy = engagement.copy()
393-
calculate_grade(product)
393+
calculate_grade(product.id)
394394
messages.add_message(
395395
request,
396396
messages.SUCCESS,

dojo/finding/deduplication.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.db.models.query_utils import Q
99

1010
from dojo.celery import app
11-
from dojo.decorators import dojo_async_task, dojo_model_from_id, dojo_model_to_id
11+
from dojo.decorators import dojo_async_task
1212
from dojo.models import Finding, System_Settings
1313

1414
logger = logging.getLogger(__name__)
@@ -45,12 +45,10 @@ def get_finding_models_for_deduplication(finding_ids):
4545
)
4646

4747

48-
@dojo_model_to_id
4948
@dojo_async_task
5049
@app.task
51-
@dojo_model_from_id
52-
def do_dedupe_finding_task(new_finding, *args, **kwargs):
53-
return do_dedupe_finding(new_finding, *args, **kwargs)
50+
def do_dedupe_finding_task(new_finding_id, *args, **kwargs):
51+
return do_dedupe_finding_task_internal(Finding.objects.get(id=new_finding_id), *args, **kwargs)
5452

5553

5654
@dojo_async_task
@@ -71,7 +69,7 @@ def do_dedupe_batch_task(finding_ids, *args, **kwargs):
7169
dedupe_batch_of_findings(findings)
7270

7371

74-
def do_dedupe_finding(new_finding, *args, **kwargs):
72+
def do_dedupe_finding_task_internal(new_finding, *args, **kwargs):
7573
from dojo.utils import get_custom_method # noqa: PLC0415 -- circular import
7674
if dedupe_method := get_custom_method("FINDING_DEDUPE_METHOD"):
7775
return dedupe_method(new_finding, *args, **kwargs)

dojo/finding/helper.py

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
import dojo.jira_link.helper as jira_helper
1717
import dojo.risk_acceptance.helper as ra_helper
1818
from dojo.celery import app
19-
from dojo.decorators import dojo_async_task, dojo_model_from_id, dojo_model_to_id
19+
from dojo.decorators import dojo_async_task
2020
from dojo.endpoint.utils import endpoint_get_or_create, save_endpoints_to_add
2121
from dojo.file_uploads.helper import delete_related_files
2222
from dojo.finding.deduplication import (
2323
dedupe_batch_of_findings,
24-
do_dedupe_finding,
24+
do_dedupe_finding_task_internal,
2525
get_finding_models_for_deduplication,
2626
)
2727
from dojo.models import (
@@ -43,6 +43,7 @@
4343
close_external_issue,
4444
do_false_positive_history,
4545
get_current_user,
46+
get_object_or_none,
4647
mass_model_updater,
4748
to_str_typed,
4849
)
@@ -390,27 +391,14 @@ def add_findings_to_auto_group(name, findings, group_by, *, create_finding_group
390391
finding_group.findings.add(*findings)
391392

392393

393-
@dojo_model_to_id
394-
@dojo_async_task(signature=True)
395-
@app.task
396-
@dojo_model_from_id
397-
def post_process_finding_save_signature(finding, dedupe_option=True, rules_option=True, product_grading_option=True, # noqa: FBT002
398-
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
399-
"""
400-
Returns a task signature for post-processing a finding. This is useful for creating task signatures
401-
that can be used in chords or groups or to await results. We need this extra method because of our dojo_async decorator.
402-
If we use more of these celery features, we should probably move away from that decorator.
403-
"""
404-
return post_process_finding_save_internal(finding, dedupe_option, rules_option, product_grading_option,
405-
issue_updater_option, push_to_jira, user, *args, **kwargs)
406-
407-
408-
@dojo_model_to_id
409394
@dojo_async_task
410395
@app.task
411-
@dojo_model_from_id
412-
def post_process_finding_save(finding, dedupe_option=True, rules_option=True, product_grading_option=True, # noqa: FBT002
396+
def post_process_finding_save(finding_id, dedupe_option=True, rules_option=True, product_grading_option=True, # noqa: FBT002
413397
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
398+
finding = get_object_or_none(Finding, id=finding_id)
399+
if not finding:
400+
logger.warning("Finding with id %s does not exist, skipping post_process_finding_save", finding_id)
401+
return None
414402

415403
return post_process_finding_save_internal(finding, dedupe_option, rules_option, product_grading_option,
416404
issue_updater_option, push_to_jira, user, *args, **kwargs)
@@ -429,7 +417,7 @@ def post_process_finding_save_internal(finding, dedupe_option=True, rules_option
429417
if dedupe_option:
430418
if finding.hash_code is not None:
431419
if system_settings.enable_deduplication:
432-
do_dedupe_finding(finding, *args, **kwargs)
420+
do_dedupe_finding_task_internal(finding, *args, **kwargs)
433421
else:
434422
deduplicationLogger.debug("skipping dedupe because it's disabled in system settings")
435423
else:
@@ -448,7 +436,7 @@ def post_process_finding_save_internal(finding, dedupe_option=True, rules_option
448436

449437
if product_grading_option:
450438
if system_settings.enable_product_grade:
451-
calculate_grade(finding.test.engagement.product)
439+
calculate_grade(finding.test.engagement.product.id)
452440
else:
453441
deduplicationLogger.debug("skipping product grading because it's disabled in system settings")
454442

@@ -465,14 +453,6 @@ def post_process_finding_save_internal(finding, dedupe_option=True, rules_option
465453
jira_helper.push_to_jira(finding.finding_group)
466454

467455

468-
@dojo_async_task(signature=True)
469-
@app.task
470-
def post_process_findings_batch_signature(finding_ids, *args, dedupe_option=True, rules_option=True, product_grading_option=True,
471-
issue_updater_option=True, push_to_jira=False, user=None, **kwargs):
472-
return post_process_findings_batch(finding_ids, *args, dedupe_option=dedupe_option, rules_option=rules_option, product_grading_option=product_grading_option, issue_updater_option=issue_updater_option, push_to_jira=push_to_jira, user=user, **kwargs)
473-
# Pass arguments as keyword arguments to ensure Celery properly serializes them
474-
475-
476456
@dojo_async_task
477457
@app.task
478458
def post_process_findings_batch(finding_ids, *args, dedupe_option=True, rules_option=True, product_grading_option=True,
@@ -516,7 +496,7 @@ def post_process_findings_batch(finding_ids, *args, dedupe_option=True, rules_op
516496
tool_issue_updater.async_tool_issue_update(finding)
517497

518498
if product_grading_option and system_settings.enable_product_grade:
519-
calculate_grade(findings[0].test.engagement.product)
499+
calculate_grade(findings[0].test.engagement.product.id)
520500

521501
if push_to_jira:
522502
for finding in findings:
@@ -1038,7 +1018,7 @@ def close_finding(
10381018
ra_helper.risk_unaccept(user, finding, perform_save=False)
10391019

10401020
# External issues (best effort)
1041-
close_external_issue(finding, "Closed by defectdojo", "github")
1021+
close_external_issue(finding.id, "Closed by defectdojo", "github")
10421022

10431023
# JIRA sync
10441024
push_to_jira = False

dojo/finding/views.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,9 +1003,9 @@ def process_github_form(self, request: HttpRequest, finding: Finding, context: d
10031003

10041004
if context["gform"].is_valid():
10051005
if GITHUB_Issue.objects.filter(finding=finding).exists():
1006-
update_external_issue(finding, old_status, "github")
1006+
update_external_issue(finding.id, old_status, "github")
10071007
else:
1008-
add_external_issue(finding, "github")
1008+
add_external_issue(finding.id, "github")
10091009

10101010
return request, True
10111011
add_field_errors_to_response(context["gform"])
@@ -1082,7 +1082,7 @@ def process_form(self, request: HttpRequest, finding: Finding, context: dict):
10821082
product = finding.test.engagement.product
10831083
finding.delete()
10841084
# Update the grade of the product async
1085-
calculate_grade(product)
1085+
calculate_grade(product.id)
10861086
# Add a message to the request that the finding was successfully deleted
10871087
messages.add_message(
10881088
request,
@@ -1318,7 +1318,7 @@ def reopen_finding(request, fid):
13181318
if jira_helper.is_push_all_issues(finding) or jira_helper.is_keep_in_sync_with_jira(finding):
13191319
jira_helper.push_to_jira(finding)
13201320

1321-
reopen_external_issue(finding, "re-opened by defectdojo", "github")
1321+
reopen_external_issue(finding.id, "re-opened by defectdojo", "github")
13221322

13231323
messages.add_message(
13241324
request, messages.SUCCESS, "Finding Reopened.", extra_tags="alert-success",
@@ -1353,7 +1353,7 @@ def copy_finding(request, fid):
13531353
test = form.cleaned_data.get("test")
13541354
product = finding.test.engagement.product
13551355
finding_copy = finding.copy(test=test)
1356-
calculate_grade(product)
1356+
calculate_grade(product.id)
13571357
messages.add_message(
13581358
request,
13591359
messages.SUCCESS,
@@ -2101,7 +2101,7 @@ def promote_to_finding(request, fid):
21012101
).push_all_issues,
21022102
)
21032103
if gform.is_valid():
2104-
add_external_issue(new_finding, "github")
2104+
add_external_issue(new_finding.id, "github")
21052105

21062106
messages.add_message(
21072107
request,
@@ -2733,7 +2733,7 @@ def _bulk_update_finding_status_and_severity(finds, form, request, system_settin
27332733
fp.save_no_options()
27342734

27352735
for prod in prods:
2736-
calculate_grade(prod)
2736+
calculate_grade(prod.id)
27372737

27382738
if skipped_duplicate_count > 0:
27392739
messages.add_message(
@@ -2789,7 +2789,7 @@ def _bulk_update_risk_acceptance(finds, form, request, prods):
27892789
ra_helper.risk_unaccept(request.user, finding)
27902790

27912791
for prod in prods:
2792-
calculate_grade(prod)
2792+
calculate_grade(prod.id)
27932793

27942794
if skipped_risk_accept_count > 0:
27952795
messages.add_message(
@@ -3084,9 +3084,9 @@ def finding_bulk_update_all(request, pid=None):
30843084
old_status = finding.status()
30853085
if form.cleaned_data["push_to_github"]:
30863086
if GITHUB_Issue.objects.filter(finding=finding).exists():
3087-
update_external_issue(finding, old_status, "github")
3087+
update_external_issue(finding.id, old_status, "github")
30883088
else:
3089-
add_external_issue(finding, "github")
3089+
add_external_issue(finding.id, "github")
30903090

30913091
if form.cleaned_data["notes"]:
30923092
logger.debug("Setting bulk notes")

dojo/importers/base_importer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ def maybe_launch_post_processing_chord(
668668
product = self.test.engagement.product
669669
system_settings = System_Settings.objects.get()
670670
if system_settings.enable_product_grade:
671-
calculate_grade_signature = utils.calculate_grade_signature(product)
671+
calculate_grade_signature = utils.calculate_grade.si(product.id)
672672
chord(post_processing_task_signatures)(calculate_grade_signature)
673673
else:
674674
group(post_processing_task_signatures).apply_async()

0 commit comments

Comments
 (0)