Skip to content

Commit 4bf8bc4

Browse files
committed
update model + migration
1 parent ad93859 commit 4bf8bc4

25 files changed

+123
-93
lines changed

docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ services:
127127
POSTGRES_PASSWORD: ${DD_DATABASE_PASSWORD:-defectdojo}
128128
volumes:
129129
- defectdojo_postgres:/var/lib/postgresql/data
130+
- ./psql_bck:/psql_bck
130131
redis:
131132
# Pinning to this version due to licensing constraints
132133
image: redis:7.2.9-alpine@sha256:fce236b99c58ef7196c4e243e43f533b404d5c17239cae4e6e262b729a1952b3

dojo/api_v2/serializers.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,33 +1555,21 @@ def update(self, instance, validated_data):
15551555

15561556
@extend_schema_field(serializers.CharField())
15571557
def get_path(self, obj):
1558-
engagement = Engagement.objects.filter(
1559-
risk_acceptance__id__in=[obj.id],
1560-
).first()
15611558
path = "No proof has been supplied"
1562-
if engagement and obj.filename() is not None:
1559+
if obj.filename() is not None:
15631560
path = reverse(
1564-
"download_risk_acceptance", args=(engagement.id, obj.id),
1561+
"download_risk_acceptance", args=(obj.engagement.id, obj.id),
15651562
)
15661563
request = self.context.get("request")
15671564
if request:
15681565
path = request.build_absolute_uri(path)
15691566
return path
15701567

1571-
@extend_schema_field(serializers.IntegerField())
1572-
def get_engagement(self, obj):
1573-
engagement = Engagement.objects.filter(
1574-
risk_acceptance__id__in=[obj.id],
1575-
).first()
1576-
return EngagementSerializer(read_only=True).to_representation(
1577-
engagement,
1578-
)
1579-
15801568
def validate(self, data):
1581-
def validate_findings_have_same_engagement(finding_objects: list[Finding]):
1569+
def validate_findings_have_same_engagement(finding_objects: list[Finding]): # TODO: check
15821570
engagements = finding_objects.values_list("test__engagement__id", flat=True).distinct().count()
15831571
if engagements > 1:
1584-
msg = "You are not permitted to add findings from multiple engagements"
1572+
msg = "You are not permitted to add findings from multiple engagements" # TODO: same is missing for UI
15851573
raise PermissionDenied(msg)
15861574

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

dojo/api_v2/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ def destroy(self, request, *args, **kwargs):
420420
def get_queryset(self):
421421
return (
422422
get_authorized_engagements(Permissions.Engagement_View)
423-
.prefetch_related("notes", "risk_acceptance", "files")
423+
.prefetch_related("notes", "risk_acceptance_set", "files")
424424
.distinct()
425425
)
426426

@@ -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", "owner", "accepted_findings",
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(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: 9 additions & 4 deletions
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,
@@ -1226,8 +1226,6 @@ def add_risk_acceptance(request, eid, fid=None):
12261226
if notes:
12271227
risk_acceptance.notes.add(notes)
12281228

1229-
eng.risk_acceptance.add(risk_acceptance)
1230-
12311229
findings = form.cleaned_data["accepted_findings"]
12321230

12331231
risk_acceptance = ra_helper.add_findings_to_risk_acceptance(request.user, risk_acceptance, findings)
@@ -1241,13 +1239,16 @@ def add_risk_acceptance(request, eid, fid=None):
12411239
return redirect_to_return_url_or_else(request, reverse("view_engagement", args=(eid, )))
12421240
else:
12431241
risk_acceptance_title_suggestion = f"Accept: {finding}"
1244-
form = RiskAcceptanceForm(initial={"owner": request.user, "name": risk_acceptance_title_suggestion})
1242+
form = RiskAcceptanceForm(initial={"owner": request.user, "name": risk_acceptance_title_suggestion, "engagement": eng.id})
12451243

12461244
finding_choices = Finding.objects.filter(duplicate=False, test__engagement=eng).filter(NOT_ACCEPTED_FINDINGS_QUERY).order_by("title")
12471245

12481246
form.fields["accepted_findings"].queryset = finding_choices
12491247
if fid:
12501248
form.fields["accepted_findings"].initial = {fid}
1249+
field = form.fields["engagement"]
1250+
field.widget = field.hidden_widget()
1251+
12511252
product_tab = Product_Tab(eng.product, title="Risk Acceptance", tab="engagements")
12521253
product_tab.setEngagement(eng)
12531254

@@ -1386,6 +1387,10 @@ def view_edit_risk_acceptance(request, eid, raid, *, edit_mode=False):
13861387
elif edit_mode:
13871388
risk_acceptance_form = EditRiskAcceptanceForm(instance=risk_acceptance)
13881389

1390+
if risk_acceptance_form:
1391+
field = risk_acceptance_form.fields["engagement"]
1392+
field.widget = field.hidden_widget()
1393+
13891394
note_form = NoteForm()
13901395
replace_form = ReplaceRiskAcceptanceProofForm(instance=risk_acceptance)
13911396
add_findings_form = AddFindingsRiskAcceptanceForm(instance=risk_acceptance)

dojo/filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2800,7 +2800,7 @@ class Meta:
28002800
"name", "accepted_findings", "recommendation", "recommendation_details",
28012801
"decision", "decision_details", "accepted_by", "owner", "expiration_date",
28022802
"expiration_date_warned", "expiration_date_handled", "reactivate_expired",
2803-
"restart_sla_expired", "notes",
2803+
"restart_sla_expired", "notes", "engagement",
28042804
]
28052805

28062806

dojo/fixtures/defect_dojo_sample_data.json

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,7 +2784,6 @@
27842784
"deduplication_on_engagement": false,
27852785
"notes": [],
27862786
"files": [],
2787-
"risk_acceptance": [],
27882787
"tags": [],
27892788
"inherited_tags": []
27902789
}
@@ -2831,7 +2830,6 @@
28312830
"deduplication_on_engagement": false,
28322831
"notes": [],
28332832
"files": [],
2834-
"risk_acceptance": [],
28352833
"tags": [],
28362834
"inherited_tags": []
28372835
}
@@ -2878,7 +2876,6 @@
28782876
"deduplication_on_engagement": false,
28792877
"notes": [],
28802878
"files": [],
2881-
"risk_acceptance": [],
28822879
"tags": [],
28832880
"inherited_tags": []
28842881
}
@@ -2925,7 +2922,6 @@
29252922
"deduplication_on_engagement": false,
29262923
"notes": [],
29272924
"files": [],
2928-
"risk_acceptance": [],
29292925
"tags": [],
29302926
"inherited_tags": []
29312927
}
@@ -2972,7 +2968,6 @@
29722968
"deduplication_on_engagement": false,
29732969
"notes": [],
29742970
"files": [],
2975-
"risk_acceptance": [],
29762971
"tags": [
29772972
"pci"
29782973
],
@@ -3019,7 +3014,6 @@
30193014
"deduplication_on_engagement": false,
30203015
"notes": [],
30213016
"files": [],
3022-
"risk_acceptance": [],
30233017
"tags": [],
30243018
"inherited_tags": []
30253019
}
@@ -3066,7 +3060,6 @@
30663060
"deduplication_on_engagement": false,
30673061
"notes": [],
30683062
"files": [],
3069-
"risk_acceptance": [],
30703063
"tags": [],
30713064
"inherited_tags": []
30723065
}
@@ -3113,7 +3106,6 @@
31133106
"deduplication_on_engagement": false,
31143107
"notes": [],
31153108
"files": [],
3116-
"risk_acceptance": [],
31173109
"tags": [
31183110
"pci"
31193111
],
@@ -3162,7 +3154,6 @@
31623154
"deduplication_on_engagement": false,
31633155
"notes": [],
31643156
"files": [],
3165-
"risk_acceptance": [],
31663157
"tags": [],
31673158
"inherited_tags": []
31683159
}
@@ -3209,7 +3200,6 @@
32093200
"deduplication_on_engagement": false,
32103201
"notes": [],
32113202
"files": [],
3212-
"risk_acceptance": [],
32133203
"tags": [],
32143204
"inherited_tags": []
32153205
}
@@ -3254,7 +3244,6 @@
32543244
"deduplication_on_engagement": false,
32553245
"notes": [],
32563246
"files": [],
3257-
"risk_acceptance": [],
32583247
"tags": [],
32593248
"inherited_tags": []
32603249
}
@@ -33296,6 +33285,7 @@
3329633285
"restart_sla_expired": false,
3329733286
"created": "2024-01-29T15:35:18.089Z",
3329833287
"updated": "2024-01-29T15:35:18.089Z",
33288+
"engagement": 1,
3329933289
"accepted_findings": [
3330033290
2
3330133291
],

dojo/fixtures/dojo_testdata.json

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,6 @@
532532
"report_type": null,
533533
"first_contacted": null,
534534
"tmodel_path": "none",
535-
"risk_acceptance": [],
536535
"lead": 2,
537536
"version": null,
538537
"progress": "threat_model",
@@ -562,9 +561,6 @@
562561
"report_type": null,
563562
"first_contacted": null,
564563
"tmodel_path": "none",
565-
"risk_acceptance": [
566-
1
567-
],
568564
"lead": 1,
569565
"version": null,
570566
"progress": "threat_model",
@@ -594,7 +590,6 @@
594590
"report_type": null,
595591
"first_contacted": null,
596592
"tmodel_path": "none",
597-
"risk_acceptance": [],
598593
"lead": 2,
599594
"version": null,
600595
"progress": "threat_model",
@@ -627,7 +622,6 @@
627622
"report_type": null,
628623
"first_contacted": null,
629624
"tmodel_path": "none",
630-
"risk_acceptance": [],
631625
"lead": 1,
632626
"version": null,
633627
"progress": "threat_model",
@@ -657,7 +651,6 @@
657651
"report_type": null,
658652
"first_contacted": null,
659653
"tmodel_path": "none",
660-
"risk_acceptance": [],
661654
"lead": 1,
662655
"version": null,
663656
"progress": "threat_model",
@@ -697,6 +690,7 @@
697690
"restart_sla_expired": false,
698691
"created": "2023-03-01T22:12:43.829Z",
699692
"updated": "2023-03-01T22:12:43.891Z",
693+
"engagement": 2,
700694
"accepted_findings": [
701695
226
702696
],
@@ -712,7 +706,6 @@
712706
"report_type": null,
713707
"first_contacted": null,
714708
"tmodel_path": "none",
715-
"risk_acceptance": [],
716709
"lead": 1,
717710
"version": null,
718711
"progress": "threat_model",

0 commit comments

Comments
 (0)