Coverage for e2xgrader/server_extensions/apps/help/apihandlers.py: 34%

32 statements  

« prev     ^ index     » next       coverage.py v7.4.2, created at 2024-03-14 13:22 +0100

1import json 

2import os 

3 

4from e2xcore import urljoin 

5from e2xcore.handlers import E2xApiHandler 

6from tornado import web 

7 

8 

9class ListFilesHandler(E2xApiHandler): 

10 def list_files(self, path_id, path): 

11 self.log.info(f"Listing files from {path}") 

12 if path is None or not os.path.exists(path): 

13 return [] 

14 file_list = [] 

15 exclude_dirs = [] 

16 

17 for root, dirs, files in os.walk(path): 

18 for name in dirs: 

19 if name.startswith("."): 

20 exclude_dirs.append(name) 

21 elif os.path.isfile(os.path.join(root, name, "index.html")): 

22 exclude_dirs.append(name) 

23 file_list.append( 

24 ( 

25 os.path.join(root, name), 

26 os.path.join(root, name, "index.html"), 

27 ) 

28 ) 

29 

30 dirs[:] = [d for d in dirs if d not in exclude_dirs] 

31 

32 for name in files: 

33 file_list.append((os.path.join(root, name), os.path.join(root, name))) 

34 

35 file_list = [ 

36 ( 

37 os.path.relpath(name, path), 

38 os.path.join(path_id, os.path.relpath(url, path)), 

39 ) 

40 for name, url in file_list 

41 ] 

42 

43 return file_list 

44 

45 @web.authenticated 

46 def get(self): 

47 files = [] 

48 for path_id, path in self.settings.get("e2xhelp_shared_dirs", dict()).items(): 

49 files.extend(self.list_files(path_id, path)) 

50 self.write(json.dumps(files)) 

51 

52 

53api_url = urljoin("e2x", "help", "api") 

54default_handlers = [ 

55 (urljoin(api_url, "files"), ListFilesHandler), 

56]