Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
2 changes: 1 addition & 1 deletion backend/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions backend/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down
11 changes: 8 additions & 3 deletions backend/iam/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/lib/components/Forms/ModelForm.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
taintedMessage?: string | boolean;
model: ModelInfo;
context?: string;
origin?: string | null;
caching?: boolean;
closeModal?: boolean;
parent?: any;
Expand All @@ -113,6 +114,7 @@
taintedMessage = m.taintedFormMessage(),
model,
context = 'default',
origin = null,
caching = false,
closeModal = false,
parent = {},
Expand Down Expand Up @@ -367,6 +369,7 @@
{cacheLocks}
{formDataCache}
{schema}
{origin}
{initialData}
{...rest}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
cacheLocks?: Record<string, CacheLock>;
formDataCache?: Record<string, any>;
schema?: any;
origin?: string | null;
initialData?: Record<string, any>;
}
Expand All @@ -33,6 +34,7 @@
cacheLocks = {},
formDataCache = $bindable({}),
schema = {},
origin = null,
initialData = {}
}: Props = $props();
Expand Down Expand Up @@ -67,6 +69,12 @@
});
}
});
let domainOptionEndpoint = $derived(
origin === 'requirement-assessments'
? `folders/${initialData.folder}/subdomains/`
: 'folders?content_type=DO&content_type=GL'
);
</script>

{#if !duplicate}
Expand Down Expand Up @@ -343,11 +351,10 @@

<AutocompleteSelect
{form}
optionsEndpoint="folders?content_type=DO&content_type=GL"
optionsEndpoint={domainOptionEndpoint}
field="folder"
pathField="path"
cacheLock={cacheLocks['folder']}
bind:cachedValue={formDataCache['folder']}
label={m.domain()}
hidden={initialData.folder}
/>
3 changes: 3 additions & 0 deletions frontend/src/lib/components/Modals/CreateModal.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
invalidateAll?: boolean; // set to false to keep form data using muliple forms on a page
formAction?: string;
context?: string;
origin?: string | null;
additionalInitialData?: any;
suggestions?: { [key: string]: any };
taintedMessage?: string | boolean;
Expand All @@ -43,6 +44,7 @@
invalidateAll = true,
formAction = '?/create',
context = 'create',
origin = null,
additionalInitialData = {},
suggestions = {},
taintedMessage = false,
Expand Down Expand Up @@ -87,6 +89,7 @@
{model}
{closeModal}
{context}
{origin}
{duplicate}
{taintedMessage}
caching={true}
Expand Down
4 changes: 3 additions & 1 deletion frontend/src/params/fields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import type { ParamMatcher } from '@sveltejs/kit';
*/

export const match = ((param) => {
const fields = new Set<string>();
const fields = new Set<string>([
'subdomains' // For the /folders/{uuid}/subdomains/ endpoint.
]);

Object.values(listViewFields).forEach((field) => {
if ('body' in field && field.body) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
model: data.measureModel,
debug: false,
invalidateAll: false,
origin: 'requirement-assessments',
suggestions: { reference_control: reference_controls }
}
};
Expand Down
Loading