Skip to content

Commit 8755e4f

Browse files
committed
update model + migration
1 parent ad93859 commit 8755e4f

File tree

9 files changed

+88
-35
lines changed

9 files changed

+88
-35
lines changed

dojo/api_v2/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1578,10 +1578,10 @@ def get_engagement(self, obj):
15781578
)
15791579

15801580
def validate(self, data):
1581-
def validate_findings_have_same_engagement(finding_objects: list[Finding]):
1581+
def validate_findings_have_same_engagement(finding_objects: list[Finding]): # TODO: check
15821582
engagements = finding_objects.values_list("test__engagement__id", flat=True).distinct().count()
15831583
if engagements > 1:
1584-
msg = "You are not permitted to add findings from multiple engagements"
1584+
msg = "You are not permitted to add findings from multiple engagements" # TODO: same is missing for UI
15851585
raise PermissionDenied(msg)
15861586

15871587
findings = data.get("accepted_findings", [])

dojo/api_v2/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ def get_queryset(self):
704704
return (
705705
get_authorized_risk_acceptances(Permissions.Risk_Acceptance)
706706
.prefetch_related(
707-
"notes", "engagement_set", "owner", "accepted_findings",
707+
"notes", "engagement_set", "owner", "accepted_findings", # TODO: Check this
708708
)
709709
.distinct()
710710
)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.1.8 on 2025-05-01 12:54
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('dojo', '0230_alter_jira_instance_accepted_mapping_resolution_and_more'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='risk_acceptance',
16+
name='engagement',
17+
field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='dojo.engagement'),
18+
),
19+
]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Generated by Django 5.1.8 on 2025-05-01 12:59
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
import logging
6+
7+
logger = logging.getLogger(__name__)
8+
9+
def set_engagement_based_on_findings(apps, schema_editor):
10+
Engagement = apps.get_model('dojo', 'Engagement')
11+
RiskAcceptance = apps.get_model('dojo', 'Risk_Acceptance')
12+
through_model = Engagement.risk_acceptance.through
13+
14+
for rel in through_model.objects.all():
15+
ra = RiskAcceptance.objects.get(pk=rel.risk_acceptance_id)
16+
ra.engagement_id = rel.engagement_id
17+
ra.save()
18+
19+
20+
class Migration(migrations.Migration):
21+
22+
dependencies = [
23+
('dojo', '0231_add_engagement_risk_acceptance'),
24+
]
25+
26+
operations = [
27+
migrations.RunPython(set_engagement_based_on_findings, migrations.RunPython.noop),
28+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.1.8 on 2025-05-01 12:59
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('dojo', '0232_set_risk_acceptance_engagement'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='risk_acceptance',
16+
name='engagement',
17+
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='dojo.engagement'),
18+
),
19+
migrations.RemoveField(
20+
model_name='engagement',
21+
name='risk_acceptance',
22+
),
23+
]

dojo/engagement/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def get_template(self):
425425
return "dojo/view_eng.html"
426426

427427
def get_risks_accepted(self, eng):
428-
return eng.risk_acceptance.all().select_related("owner").annotate(accepted_findings_count=Count("accepted_findings__id"))
428+
return eng.risk_acceptance_set.all().select_related("owner").annotate(accepted_findings_count=Count("accepted_findings__id"))
429429

430430
def get_filtered_tests(
431431
self,

dojo/models.py

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,10 +1505,6 @@ class Engagement(models.Model):
15051505
default="threat_model", editable=False)
15061506
tmodel_path = models.CharField(max_length=1000, default="none",
15071507
editable=False, blank=True, null=True)
1508-
risk_acceptance = models.ManyToManyField("Risk_Acceptance",
1509-
default=None,
1510-
editable=False,
1511-
blank=True)
15121508
done_testing = models.BooleanField(default=False, editable=False)
15131509
engagement_type = models.CharField(editable=True, max_length=30, default="Interactive",
15141510
null=True,
@@ -1550,7 +1546,7 @@ def copy(self):
15501546
old_notes = list(self.notes.all())
15511547
old_files = list(self.files.all())
15521548
old_tags = list(self.tags.all())
1553-
old_risk_acceptances = list(self.risk_acceptance.all())
1549+
old_risk_acceptances = list(self.risk_acceptance_set.all())
15541550
old_tests = list(Test.objects.filter(engagement=self))
15551551
# Save the object before setting any ManyToMany relationships
15561552
copy.save()
@@ -1565,7 +1561,7 @@ def copy(self):
15651561
test.copy(engagement=copy)
15661562
# Copy the risk_acceptances
15671563
for risk_acceptance in old_risk_acceptances:
1568-
copy.risk_acceptance.add(risk_acceptance.copy(engagement=copy))
1564+
risk_acceptance.copy(engagement=copy)
15691565
# Assign any tags
15701566
copy.tags.set(old_tags)
15711567

@@ -1595,9 +1591,6 @@ def unaccepted_open_findings(self):
15951591

15961592
return findings
15971593

1598-
def accept_risks(self, accepted_risks):
1599-
self.risk_acceptance.add(*accepted_risks)
1600-
16011594
@property
16021595
def has_jira_issue(self):
16031596
import dojo.jira_link.helper as jira_helper
@@ -2163,9 +2156,6 @@ def unaccepted_open_findings(self):
21632156

21642157
return findings
21652158

2166-
def accept_risks(self, accepted_risks):
2167-
self.engagement.risk_acceptance.add(*accepted_risks)
2168-
21692159
@property
21702160
def deduplication_algorithm(self):
21712161
deduplicationAlgorithm = settings.DEDUPE_ALGO_LEGACY
@@ -3663,6 +3653,8 @@ class Risk_Acceptance(models.Model):
36633653

36643654
name = models.CharField(max_length=300, null=False, blank=False, help_text=_("Descriptive name which in the future may also be used to group risk acceptances together across engagements and products"))
36653655

3656+
engagement = models.ForeignKey(Engagement, editable=False, blank=False, null=False, on_delete=models.CASCADE)
3657+
36663658
accepted_findings = models.ManyToManyField(Finding)
36673659

36683660
recommendation = models.CharField(choices=TREATMENT_CHOICES, max_length=2, null=False, default=TREATMENT_FIX, help_text=_("Recommendation from the security team."), verbose_name=_("Security Recommendation"))
@@ -3704,26 +3696,17 @@ def name_and_expiration_info(self):
37043696
return str(self.name) + (" (expired " if self.is_expired else " (expires ") + (timezone.localtime(self.expiration_date).strftime("%b %d, %Y") if self.expiration_date else "Never") + ")"
37053697

37063698
def get_breadcrumbs(self):
3707-
bc = self.engagement_set.first().get_breadcrumbs()
3699+
bc = self.engagement.get_breadcrumbs()
37083700
bc += [{"title": str(self),
37093701
"url": reverse("view_risk_acceptance", args=(
3710-
self.engagement_set.first().product.id, self.id))}]
3702+
self.engagement.product.id, self.id))}]
37113703
return bc
37123704

37133705
@property
37143706
def is_expired(self):
37153707
return self.expiration_date_handled is not None
37163708

3717-
# relationship is many to many, but we use it as one-to-many
3718-
@property
3719-
def engagement(self):
3720-
engs = self.engagement_set.all()
3721-
if engs:
3722-
return engs[0]
3723-
3724-
return None
3725-
3726-
def copy(self, engagement=None):
3709+
def copy(self, engagement):
37273710
copy = _copy_model_util(self)
37283711
# Save the necessary ManyToMany relationships
37293712
old_notes = list(self.notes.all())
@@ -3734,9 +3717,10 @@ def copy(self, engagement=None):
37343717
for notes in old_notes:
37353718
copy.notes.add(notes.copy())
37363719
# Assign any accepted findings
3737-
if engagement:
3738-
new_accepted_findings = Finding.objects.filter(test__engagement=engagement, hash_code__in=old_accepted_findings_hash_codes, risk_accepted=True).distinct()
3739-
copy.accepted_findings.set(new_accepted_findings)
3720+
new_accepted_findings = Finding.objects.filter(test__engagement=engagement, hash_code__in=old_accepted_findings_hash_codes, risk_accepted=True).distinct()
3721+
copy.accepted_findings.set(new_accepted_findings)
3722+
copy.engagement = engagement
3723+
copy.save()
37403724
return copy
37413725

37423726

dojo/risk_acceptance/api.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ def accept_risks(self, request, pk=None):
5252
base_findings = model.unaccepted_open_findings
5353
owner = request.user
5454
accepted = _accept_risks(accepted_risks, base_findings, owner)
55-
model.accept_risks(accepted)
5655
result = RiskAcceptanceSerializer(instance=accepted, many=True)
5756
return Response(status=status.HTTP_201_CREATED, data=result.data)
5857

@@ -75,7 +74,6 @@ def accept_risks(self, request):
7574
for engagement in get_authorized_engagements(Permissions.Engagement_View):
7675
base_findings = engagement.unaccepted_open_findings
7776
accepted = _accept_risks(accepted_risks, base_findings, owner)
78-
engagement.accept_risks(accepted)
7977
accepted_result.extend(accepted)
8078
result = RiskAcceptanceSerializer(instance=accepted_result, many=True)
8179
return Response(status=201, data=result.data)
@@ -95,7 +93,8 @@ def _accept_risks(accepted_risks: list[AcceptedRisk], base_findings: QuerySet, o
9593
acceptance = Risk_Acceptance.objects.create(owner=owner, name=name[:100],
9694
decision=Risk_Acceptance.TREATMENT_ACCEPT,
9795
decision_details=risk.justification,
98-
accepted_by=risk.accepted_by[:200])
96+
accepted_by=risk.accepted_by[:200],
97+
engagement=findings[0].test.engagement) # TODO: Add validator that all findings are from this Eng to Model
9998
acceptance.accepted_findings.set(findings)
10099
findings.update(risk_accepted=True, active=False)
101100
acceptance.save()

dojo/risk_acceptance/helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def get_almost_expired_risk_acceptances_to_handle(heads_up_days):
294294

295295
def prefetch_for_expiration(risk_acceptances):
296296
return risk_acceptances.prefetch_related("accepted_findings", "accepted_findings__jira_issue",
297-
"engagement_set",
297+
"engagement_set", # TODO: check this
298298
"engagement__jira_project",
299299
"engagement__jira_project__jira_instance",
300300
)

0 commit comments

Comments
 (0)