Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Original file line number Diff line number Diff line change
Expand Up @@ -343,11 +343,10 @@

<AutocompleteSelect
{form}
optionsEndpoint="folders?content_type=DO&content_type=GL"
optionsEndpoint={`folders/${initialData.folder}/subdomains/`}
field="folder"
pathField="path"
cacheLock={cacheLocks['folder']}
bind:cachedValue={formDataCache['folder']}
label={m.domain()}
hidden={initialData.folder}
/>
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
Loading