From 4f400acc9bc9be99a018468d11f5568b5315badf Mon Sep 17 00:00:00 2001 From: monsieurswag Date: Wed, 29 Oct 2025 15:42:31 +0100 Subject: [PATCH 1/4] feat: Choose the domain of applied controls created from an audit --- backend/core/models.py | 2 +- backend/core/views.py | 20 +++++++++++++++++++ backend/iam/models.py | 11 +++++++--- .../ModelForm/AppliedControlPolicyForm.svelte | 3 +-- frontend/src/params/fields.ts | 4 +++- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/backend/core/models.py b/backend/core/models.py index 5e211b288f..372d23e86f 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -4789,7 +4789,7 @@ class Meta: # risk_matrix = self.risk_assessment.risk_matrix.parse_json() # return [(k, v) for k, v in risk_matrix.fields[field].items()] - def get_folder_full_path(self, include_root: bool = False) -> list[Folder]: + def get_folder_full_path(self, *, include_root: bool = False) -> list[Folder]: return self.risk_assessment.get_folder_full_path(include_root=include_root) @property diff --git a/backend/core/views.py b/backend/core/views.py index 74d0b17728..bf918fc06d 100644 --- a/backend/core/views.py +++ b/backend/core/views.py @@ -3625,6 +3625,26 @@ def list(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs): return super().retrieve(request, *args, **kwargs) + @action(detail=True, methods=["get"]) + def subdomains(self, request, pk): + """ + Returns a list composed of the given domain and all its subdomains + """ + instance = Folder.objects.filter(pk=pk).first() + if not instance: + return Response(status=status.HTTP_404_NOT_FOUND) + + if not RoleAssignment.is_access_allowed( + user=request.user, + perm=Permission.objects.get(codename="view_folder"), + folder=instance, + ): + return Response(status=status.HTTP_403_FORBIDDEN) + + subfolders = list(instance.get_sub_folders(include_self=True)) + serializer = FolderReadSerializer(subfolders, many=True) + return Response(serializer.data) + @action(detail=False, methods=["get"]) def org_tree(self, request): """ diff --git a/backend/iam/models.py b/backend/iam/models.py index 80e0f26181..cb1df0f879 100644 --- a/backend/iam/models.py +++ b/backend/iam/models.py @@ -122,9 +122,14 @@ class Meta: def __str__(self) -> str: return self.name.__str__() - def get_sub_folders(self) -> Generator[Self, None, None]: + def get_sub_folders( + self, *, include_self: bool = False + ) -> Generator[Self, None, None]: """Return the list of subfolders""" + if include_self: + yield self + def sub_folders_in(folder): for sub_folder in folder.folder_set.all(): yield sub_folder @@ -139,7 +144,7 @@ def get_parent_folders(self) -> Generator[Self, None, None]: while (current_folder := current_folder.parent_folder) is not None: yield current_folder - def get_folder_full_path(self, include_root: bool = False) -> list[Self]: + def get_folder_full_path(self, *, include_root: bool = False) -> list[Self]: """ Get the full path of the folder including its parents. If include_root is True, the root folder is included in the path. @@ -328,7 +333,7 @@ class FolderMixin(models.Model): default=Folder.get_root_folder_id, ) - def get_folder_full_path(self, include_root: bool = False) -> list[Folder]: + def get_folder_full_path(self, *, include_root: bool = False) -> list[Folder]: folders = ([self.folder] + [f for f in self.folder.get_parent_folders()])[::-1] if include_root: return folders diff --git a/frontend/src/lib/components/Forms/ModelForm/AppliedControlPolicyForm.svelte b/frontend/src/lib/components/Forms/ModelForm/AppliedControlPolicyForm.svelte index 87a875f231..89f1a30ea2 100644 --- a/frontend/src/lib/components/Forms/ModelForm/AppliedControlPolicyForm.svelte +++ b/frontend/src/lib/components/Forms/ModelForm/AppliedControlPolicyForm.svelte @@ -343,11 +343,10 @@