Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
3a03b02
migration
ab-smith Nov 7, 2025
679a3f3
frontend
ab-smith Nov 7, 2025
8fe8f0b
is critical and associated filter for assets
ab-smith Nov 7, 2025
7d3da20
legal identifiers
ab-smith Nov 7, 2025
be5d0cb
fixup
ab-smith Nov 7, 2025
56df9de
feat: contracts management
ab-smith Nov 7, 2025
6b01138
make Main editable
ab-smith Nov 7, 2025
2b8b256
wip for report generation
ab-smith Nov 8, 2025
1458c80
fixup for tiles
ab-smith Nov 8, 2025
b9fb505
fix icon
ab-smith Nov 9, 2025
6f00d65
update countries list
ab-smith Nov 10, 2025
d3de3a2
extra fields on Entity, Solution and Contract
ab-smith Nov 10, 2025
a0cc4e3
fixup
ab-smith Nov 10, 2025
e299cad
update migration
ab-smith Nov 10, 2025
7d45a7d
fixup
ab-smith Nov 10, 2025
6dc8721
limit contract form for now
ab-smith Nov 10, 2025
31a7cf0
merge migrations
ab-smith Nov 10, 2025
006104e
more constants
ab-smith Nov 10, 2025
eeb408e
covering all exports
ab-smith Nov 11, 2025
442cc3e
refactor exports
ab-smith Nov 11, 2025
6d21f23
add linter for dora export
ab-smith Nov 12, 2025
9f8a527
support explicit beneficiary field on contract
ab-smith Nov 12, 2025
c99882d
add entities graph
ab-smith Nov 12, 2025
aaf7b0b
more rules and nesting the zip
ab-smith Nov 12, 2025
4707558
default ebios attributes
ab-smith Nov 13, 2025
c256f47
manage default criticality
ab-smith Nov 13, 2025
56e221b
sortable entities criticality
ab-smith Nov 13, 2025
203edff
data wizard for ecosystem
ab-smith Nov 13, 2025
1011bc8
Merge branch 'main' into dora_reports
ab-smith Nov 13, 2025
104ce4c
fix migrations
ab-smith Nov 13, 2025
e361f75
fixup
ab-smith Nov 13, 2025
8055de9
feature flags
ab-smith Nov 13, 2025
d9bc599
breathing room for FF
ab-smith Nov 13, 2025
ba4ac46
minor fixes
ab-smith Nov 13, 2025
9193ed6
fixup
ab-smith Nov 13, 2025
4e87cf6
fixup
ab-smith Nov 13, 2025
e34b921
fix for data wizard
ab-smith Nov 14, 2025
ccb77e0
preset ebios entity assessment from default
ab-smith Nov 14, 2025
a084192
fix filters
ab-smith Nov 14, 2025
c858aee
wip
ab-smith Nov 14, 2025
9598a6d
merge migrations
ab-smith Nov 14, 2025
ff2dc43
be able to remove the parent entity and prevent setting itself
ab-smith Nov 14, 2025
1abfe41
prevent loops on overarching contract
ab-smith Nov 14, 2025
9d9bb9e
simplify menu for now
ab-smith Nov 14, 2025
931c419
cover solutions and contracts of supporting assets
ab-smith Nov 14, 2025
79a9405
autolink documents to contracts when created from it
ab-smith Nov 14, 2025
d5cfdc8
missing fr translations
ab-smith Nov 14, 2025
aa5f112
fix test for nested menus that are hidden by default
ab-smith Nov 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
254 changes: 240 additions & 14 deletions backend/core/constants.py

Large diffs are not rendered by default.

428 changes: 428 additions & 0 deletions backend/core/dora.py

Large diffs are not rendered by default.

Large diffs are not rendered by default.

29 changes: 29 additions & 0 deletions backend/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
validate_file_size,
JSONSchemaInstanceValidator,
)
from . import dora
from collections import defaultdict, deque

logger = get_logger(__name__)
Expand Down Expand Up @@ -2165,6 +2166,34 @@ class Type(models.TextChoices):
is_published = models.BooleanField(_("published"), default=True)
observation = models.TextField(null=True, blank=True, verbose_name=_("Observation"))

is_business_function = models.BooleanField("is_business_function", default=False)
dora_licenced_activity = models.CharField(
max_length=50,
choices=dora.DORA_LICENSED_ACTIVITY_CHOICES,
blank=True,
null=True,
verbose_name=_("DORA Licensed Activity"),
)
dora_criticality_assessment = models.CharField(
max_length=50,
choices=dora.DORA_FUNCTION_CRITICALITY_CHOICES,
blank=True,
null=True,
verbose_name=_("DORA Criticality Assessment"),
)
dora_criticality_justification = models.TextField(
blank=True,
null=True,
verbose_name=_("DORA Criticality Justification"),
)
dora_discontinuing_impact = models.CharField(
max_length=50,
choices=dora.DORA_DISCONTINUING_IMPACT_CHOICES,
blank=True,
null=True,
verbose_name=_("DORA Discontinuing Impact"),
)

fields_to_check = ["name"]

class Meta:
Expand Down
11 changes: 11 additions & 0 deletions backend/core/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
)
from core.utils import time_state
from ebios_rm.models import EbiosRMStudy, Stakeholder
from tprm.models import Contract, Solution
from global_settings.utils import ff_is_enabled
from iam.models import *
from django.contrib.auth.models import Permission
Expand Down Expand Up @@ -390,6 +391,11 @@ class AssetWriteSerializer(BaseModelSerializer):
queryset=Asset.objects.all(),
required=False,
)
solutions = serializers.PrimaryKeyRelatedField(
many=True,
queryset=Solution.objects.all(),
required=False,
)

class Meta:
model = Asset
Expand Down Expand Up @@ -454,6 +460,7 @@ class AssetReadSerializer(AssetWriteSerializer):
personal_data = FieldsRelatedField(many=True)
asset_class = FieldsRelatedField(["name"])
overridden_children_capabilities = FieldsRelatedField(many=True)
solutions = FieldsRelatedField(many=True)

children_assets = serializers.SerializerMethodField()
security_objectives = serializers.SerializerMethodField()
Expand Down Expand Up @@ -1413,6 +1420,7 @@ class EvidenceReadSerializer(BaseModelSerializer):
folder = FieldsRelatedField()
applied_controls = FieldsRelatedField(many=True)
requirement_assessments = FieldsRelatedField(many=True)
contracts = FieldsRelatedField(many=True)
filtering_labels = FieldsRelatedField(["folder"], many=True)
owner = FieldsRelatedField(many=True)
status = serializers.CharField(source="get_status_display")
Expand Down Expand Up @@ -1449,6 +1457,9 @@ class EvidenceWriteSerializer(BaseModelSerializer):
timeline_entries = serializers.PrimaryKeyRelatedField(
many=True, queryset=TimelineEntry.objects.all(), required=False
)
contracts = serializers.PrimaryKeyRelatedField(
many=True, queryset=Contract.objects.all(), required=False
)
owner = serializers.PrimaryKeyRelatedField(
many=True, queryset=User.objects.all(), required=False
)
Expand Down
13 changes: 13 additions & 0 deletions backend/core/startup.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"view_riskmatrix",
"view_riskscenario",
"view_solution",
"view_contract",
"view_storedlibrary",
"view_threat",
"view_vulnerability",
Expand Down Expand Up @@ -175,6 +176,7 @@
"add_riskassessment",
"add_riskscenario",
"add_solution",
"add_contract",
"add_threat",
"add_vulnerability",
"change_appliedcontrol",
Expand All @@ -193,6 +195,7 @@
"change_riskassessment",
"change_riskscenario",
"change_solution",
"change_contract",
"change_threat",
"delete_appliedcontrol",
"delete_asset",
Expand All @@ -209,6 +212,7 @@
"delete_riskassessment",
"delete_riskscenario",
"delete_solution",
"delete_contract",
"delete_threat",
"view_appliedcontrol",
"view_asset",
Expand All @@ -233,6 +237,7 @@
"view_riskmatrix",
"view_riskscenario",
"view_solution",
"view_contract",
"view_storedlibrary",
"view_threat",
"view_user",
Expand Down Expand Up @@ -414,6 +419,7 @@
"add_riskmatrix",
"add_riskscenario",
"add_solution",
"add_contract",
"add_threat",
"change_appliedcontrol",
"change_asset",
Expand All @@ -432,6 +438,7 @@
"change_riskmatrix",
"change_riskscenario",
"change_solution",
"change_contract",
"change_threat",
"delete_appliedcontrol",
"delete_asset",
Expand All @@ -453,6 +460,7 @@
"delete_vulnerability",
"delete_riskscenario",
"delete_solution",
"delete_contract",
"delete_threat",
"view_appliedcontrol",
"view_asset",
Expand All @@ -476,6 +484,7 @@
"view_riskmatrix",
"view_riskscenario",
"view_solution",
"view_contract",
"view_storedlibrary",
"view_threat",
"view_user",
Expand Down Expand Up @@ -770,6 +779,10 @@
"change_solution",
"view_solution",
"delete_solution",
"add_contract",
"change_contract",
"view_contract",
"delete_contract",
"add_entityassessment",
"change_entityassessment",
"view_entityassessment",
Expand Down
2 changes: 2 additions & 0 deletions backend/core/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
RepresentativeViewSet,
SolutionViewSet,
EntityAssessmentViewSet,
ContractViewSet,
)
from library.views import (
MappingLibrariesList,
Expand All @@ -27,6 +28,7 @@
)
router.register(r"solutions", SolutionViewSet, basename="solutions")
router.register(r"representatives", RepresentativeViewSet, basename="representatives")
router.register(r"contracts", ContractViewSet, basename="contracts")
router.register(r"perimeters", PerimeterViewSet, basename="perimeters")
router.register(r"risk-matrices", RiskMatrixViewSet, basename="risk-matrices")
router.register(r"vulnerabilities", VulnerabilityViewSet, basename="vulnerabilities")
Expand Down
21 changes: 21 additions & 0 deletions backend/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@
from .serializers import *

from .models import Severity
from . import dora

from serdes.utils import (
get_domain_export_objects,
Expand Down Expand Up @@ -676,6 +677,10 @@ class Meta:
"filtering_labels",
"asset_class",
"personal_data",
"is_business_function",
"dora_licenced_activity",
"dora_criticality_assessment",
"dora_discontinuing_impact",
]


Expand Down Expand Up @@ -852,6 +857,21 @@ def asset_class(self, request):
]
)

@method_decorator(cache_page(60 * LONG_CACHE_TTL))
@action(detail=False, name="Get DORA licensed activity choices")
def dora_licenced_activity(self, request):
return Response(dict(dora.DORA_LICENSED_ACTIVITY_CHOICES))

@method_decorator(cache_page(60 * LONG_CACHE_TTL))
@action(detail=False, name="Get DORA criticality assessment choices")
def dora_criticality_assessment(self, request):
return Response(dict(dora.DORA_FUNCTION_CRITICALITY_CHOICES))

@method_decorator(cache_page(60 * LONG_CACHE_TTL))
@action(detail=False, name="Get DORA discontinuing impact choices")
def dora_discontinuing_impact(self, request):
return Response(dict(dora.DORA_DISCONTINUING_IMPACT_CHOICES))

@action(detail=True, name="Get asset write data")
def object(self, request, pk):
serializer_class = self.get_serializer_class(action="update")
Expand Down Expand Up @@ -5830,6 +5850,7 @@ class EvidenceViewSet(BaseModelViewSet):
"owner",
"status",
"expiry_date",
"contracts",
]

@action(detail=False, name="Get all evidences owners")
Expand Down
Loading
Loading