handlers.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. """Tornado handlers for the tree view."""
  2. # Copyright (c) Jupyter Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. from tornado import web
  5. import os
  6. from ..base.handlers import IPythonHandler, path_regex
  7. from ..utils import url_path_join, url_escape
  8. class TreeHandler(IPythonHandler):
  9. """Render the tree view, listing notebooks, etc."""
  10. def generate_breadcrumbs(self, path):
  11. breadcrumbs = [(url_path_join(self.base_url, 'tree'), '')]
  12. parts = path.split('/')
  13. for i in range(len(parts)):
  14. if parts[i]:
  15. link = url_path_join(self.base_url, 'tree',
  16. url_escape(url_path_join(*parts[:i+1])),
  17. )
  18. breadcrumbs.append((link, parts[i]))
  19. return breadcrumbs
  20. def generate_page_title(self, path):
  21. comps = path.split('/')
  22. if len(comps) > 3:
  23. for i in range(len(comps)-2):
  24. comps.pop(0)
  25. page_title = url_path_join(*comps)
  26. if page_title:
  27. return page_title+'/'
  28. else:
  29. return 'Home'
  30. @web.authenticated
  31. def get(self, path=''):
  32. path = path.strip('/')
  33. cm = self.contents_manager
  34. if cm.dir_exists(path=path):
  35. if cm.is_hidden(path) and not cm.allow_hidden:
  36. self.log.info("Refusing to serve hidden directory, via 404 Error")
  37. raise web.HTTPError(404)
  38. breadcrumbs = self.generate_breadcrumbs(path)
  39. page_title = self.generate_page_title(path)
  40. self.write(self.render_template('tree.html',
  41. page_title=page_title,
  42. notebook_path=path,
  43. breadcrumbs=breadcrumbs,
  44. terminals_available=self.settings['terminals_available'],
  45. server_root=self.settings['server_root_dir'],
  46. shutdown_button=self.settings.get('shutdown_button', False)
  47. ))
  48. elif cm.file_exists(path):
  49. # it's not a directory, we have redirecting to do
  50. model = cm.get(path, content=False)
  51. # redirect to /api/notebooks if it's a notebook, otherwise /api/files
  52. service = 'notebooks' if model['type'] == 'notebook' else 'files'
  53. url = url_path_join(
  54. self.base_url, service, url_escape(path),
  55. )
  56. self.log.debug("Redirecting %s to %s", self.request.path, url)
  57. self.redirect(url)
  58. else:
  59. raise web.HTTPError(404)
  60. #-----------------------------------------------------------------------------
  61. # URL to handler mappings
  62. #-----------------------------------------------------------------------------
  63. default_handlers = [
  64. (r"/tree%s" % path_regex, TreeHandler),
  65. (r"/tree", TreeHandler),
  66. ]