Reputation: 596
Coming from Python recursively appending list function Trying to recursively get a list of permissions associated with a file structure.
I have this function:
def get_child_perms(self, folder, request, perm_list):
# Folder contains other folders
if folder.get_children():
# For every sub-folder
return [self.get_child_perms(subfolder, request, perm_list) for subfolder in folder.get_children()]
return folder.has_read_permission(request)
That returns all the results except the folders that contain other folders.
folder <- Missing (allowed)
subfolder <- Missing (restricted)
subsubfolder <- Get this (restricted)
files
Output from function would be [True, False, False]
another case would be, where A = allowed, R = restricted
folder A
subfolder A
subsubfolder R
files
files
subfolder R
files
subfolder A
subsubfolder A
files
files
subfolder A
files
files
Output would be [True,True,False,False,True,True,True]
Upvotes: 3
Views: 319
Reputation: 10447
why not os.walk
When topdown is True, the caller can modify the dirnames list in-place (perhaps using del or slice assignment), and walk() will only recurse into the subdirectories whose names remain in dirnames; this can be used to prune the search, impose a specific order of visiting, or even to inform walk() about directories the caller creates or renames before it resumes walk() again. Modifying dirnames when topdown is False is ineffective, because in bottom-up mode the directories in dirnames are generated before dirpath itself is generated.
for example you can build generator (lazy list) that generates only non restricted directories
for (dirpath, dirnames, filenames) in os.walk("top_path"):
if restricted(dirpath):
del dirnames
continue
yield (dirpath,tuple(filenames))
Upvotes: 0
Reputation: 90889
The basic issue occurs you are only returning the folder permission
, when folder does not have any children , when it has children, you are not including the folder.has_read_permission(request)
in your return result , which is most probably causing you issue. You need to do -
def get_child_perms(self, folder, request, perm_list):
# Folder contains other folders
if folder.get_children():
# For every sub-folder
return [folder.has_read_permission(request)] + [self.get_child_perms(subfolder, request, perm_list) for subfolder in folder.get_children()]
return [folder.has_read_permission(request)]
This should result in (not tested) -
[folderperm [subfolderperm [subsubfolderperm]]
Upvotes: 3