Skip to content

Commit 480165b

Browse files
committed
update model + migration
1 parent 6b0f0c5 commit 480165b

File tree

6 files changed

+93
-21
lines changed

6 files changed

+93
-21
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
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", [])
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', '0229_alter_finding_unique_id_from_tool'),
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', '0230_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', '0231_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.all().select_related("owner").annotate(accepted_findings_count=Count("accepted_findings__id")) # TODO: check
429429

430430
def get_filtered_tests(
431431
self,

dojo/models.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,10 +1505,10 @@ 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)
1508+
# risk_acceptance = models.ManyToManyField("Risk_Acceptance", # TODO: remove this
1509+
# default=None,
1510+
# editable=False,
1511+
# blank=True)
15121512
done_testing = models.BooleanField(default=False, editable=False)
15131513
engagement_type = models.CharField(editable=True, max_length=30, default="Interactive",
15141514
null=True,
@@ -1550,7 +1550,7 @@ def copy(self):
15501550
old_notes = list(self.notes.all())
15511551
old_files = list(self.files.all())
15521552
old_tags = list(self.tags.all())
1553-
old_risk_acceptances = list(self.risk_acceptance.all())
1553+
old_risk_acceptances = list(self.risk_acceptance.all()) # TODO check this
15541554
old_tests = list(Test.objects.filter(engagement=self))
15551555
# Save the object before setting any ManyToMany relationships
15561556
copy.save()
@@ -1564,7 +1564,7 @@ def copy(self):
15641564
for test in old_tests:
15651565
test.copy(engagement=copy)
15661566
# Copy the risk_acceptances
1567-
for risk_acceptance in old_risk_acceptances:
1567+
for risk_acceptance in old_risk_acceptances: # TODO check this
15681568
copy.risk_acceptance.add(risk_acceptance.copy(engagement=copy))
15691569
# Assign any tags
15701570
copy.tags.set(old_tags)
@@ -1596,7 +1596,7 @@ def unaccepted_open_findings(self):
15961596
return findings
15971597

15981598
def accept_risks(self, accepted_risks):
1599-
self.risk_acceptance.add(*accepted_risks)
1599+
self.risk_acceptance.add(*accepted_risks) # TODO check this
16001600

16011601
@property
16021602
def has_jira_issue(self):
@@ -2164,7 +2164,7 @@ def unaccepted_open_findings(self):
21642164
return findings
21652165

21662166
def accept_risks(self, accepted_risks):
2167-
self.engagement.risk_acceptance.add(*accepted_risks)
2167+
self.engagement.risk_acceptance.add(*accepted_risks) # TODO check this
21682168

21692169
@property
21702170
def deduplication_algorithm(self):
@@ -3663,6 +3663,8 @@ class Risk_Acceptance(models.Model):
36633663

36643664
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"))
36653665

3666+
engagement = models.ForeignKey(Engagement, editable=False, blank=False, null=False, on_delete=models.CASCADE)
3667+
36663668
accepted_findings = models.ManyToManyField(Finding)
36673669

36683670
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,7 +3706,7 @@ def name_and_expiration_info(self):
37043706
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") + ")"
37053707

37063708
def get_breadcrumbs(self):
3707-
bc = self.engagement_set.first().get_breadcrumbs()
3709+
bc = self.engagement_set.first().get_breadcrumbs() # TODO check this
37083710
bc += [{"title": str(self),
37093711
"url": reverse("view_risk_acceptance", args=(
37103712
self.engagement_set.first().product.id, self.id))}]
@@ -3714,16 +3716,16 @@ def get_breadcrumbs(self):
37143716
def is_expired(self):
37153717
return self.expiration_date_handled is not None
37163718

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]
3719+
# # relationship is many to many, but we use it as one-to-many
3720+
# @property
3721+
# def engagement(self):
3722+
# engs = self.engagement_set.all()
3723+
# if engs:
3724+
# return engs[0]
37233725

3724-
return None
3726+
# return None
37253727

3726-
def copy(self, engagement=None):
3728+
def copy(self, engagement=None): # TODO check this
37273729
copy = _copy_model_util(self)
37283730
# Save the necessary ManyToMany relationships
37293731
old_notes = list(self.notes.all())
@@ -3734,7 +3736,7 @@ def copy(self, engagement=None):
37343736
for notes in old_notes:
37353737
copy.notes.add(notes.copy())
37363738
# Assign any accepted findings
3737-
if engagement:
3739+
if engagement: # TODO check this
37383740
new_accepted_findings = Finding.objects.filter(test__engagement=engagement, hash_code__in=old_accepted_findings_hash_codes, risk_accepted=True).distinct()
37393741
copy.accepted_findings.set(new_accepted_findings)
37403742
return copy

0 commit comments

Comments
 (0)